Brenno Albino Lugon
Algoritmos de reordenamento de matrizesesparsas aplicados a precondicionadores
ILU(p)
Vitória - ES2013
Brenno Albino Lugon
Algoritmos de reordenamento de matrizesesparsas aplicados a precondicionadores
ILU(p)
Trabalho de conclusão de curso apresentadoa Universidade Federal do Espírito Santo,para a obtenção de Título de Graduação,na Área de Ciência da Computação.
Orientadora: Prof𝑎 Lucia Catabriga
Vitória - ES2013
Lugon, Brenno A. Algoritmos de reordenamento de ma-trizes esparsas aplicados a precondicionadores ILU(p) 63páginas Trabalho de conclusão de curso - UniversidadeFederal do Espírito Santo. Centro Tecnológico. Departa-mento de Informática.
1. reordenamentos
2. matrizes esparsas
3. precondicionadores
I. Universidade Federal do Espírito Santo. Centro Tecnoló-gico. Departamento de Informática.
Comissão Julgadora:
Prof𝑎 Lucia Catabriga Prof𝑎 Maria Cristina RangelOrientadora
Prof𝑎 Andrea Maria Pedrosa Valli
Epígrafe
Passion.
It lies in all of us.
Sleeping, waiting, and though unwanted, unbidden.
It will stir, open its jaws, and howl.
It speaks to us, guides us.
Passion rules us all.
And we obey.
What other choice do we have?
Passion is the source of our finest moments.
The joy of love, the clarity of hatred, and the ecstasy of grief.
It hurts sometimes more than we can bear.
If we could live without passion, maybe we’d know some kind of peace.
But we would be hollow.
Empty rooms, shuttered and dank.
Without passion, we’d be truly dead.
—AngelusS02E17 "Passion"
Buffy the Vampire Slayer
Agradecimentos
A Deus.
Aos meus pais, Sérgio e Gezella, por todo o apoio.
Ao meu irmão Ryann. E meus cachorros Boby e Meg.
A todos da minha família que são presentes.
Ao meu namorado Robson, que há cinco anos me completa.
Aos meus verdadeiros amigos.
Em especial a minha orientadora Lucia, por toda a ajuda, orientação e paciência.
Resumo
O uso de precondicionadores é uma técnica eficiente para acelerar a convergência
de métodos iterativos não estacionários. Nesse contexto, podemos reduzir o tempo de
execução desses métodos aplicando uma simples troca de linhas e colunas em uma matriz
esparsa. Esse processo, chamado de reordenamento, visa reduzir o número de operações
com ponto flutuante durante a montagem das matrizes precondicionadoras. Este trabalho
faz um estudo comparativo dos algoritmos de reordenamento: Sloan, Reverse Cuthill
Mckee, Espectral, Nested Dissection e Approximate Minimum Degree, avaliando o impacto
que causam quando utilizamos o método de resolução GMRES com o precondicionador
baseado na fatoração LU incompleta, ILU(p).
Palavras-chave: matrizes esparsas, reordenamento, precondicionadores, GMRES
Abstract
The use of preconditioning is an efficient technique to accelerate the convergence of
nonstationary iterative methods. In this context, we can reduce runtime of these methods
by applying a simple exchange of rows and columns in a sparse matrix. This process,
called reordering, aims to reduce the number of floating point operations during the
preconditioner matrices computation. This work makes a comparative study of reordering
algorithms: Sloan, Reverse Cuthill Mckee, Spectral, Nested Dissection and Approximate
Minimum Degree, evaluating the impact they have when using the solver method GMRES
applied to a preconditioner based on incomplete LU factorization, ILU(p).
Keywords: sparse matrix, reordering, ILU preconditioner, GMRES
Lista de Figuras
1.1 Representações da matriz 𝑛𝑒𝑡125 . . . . . . . . . . . . . . . . . . . . . . . 2
3.1 Armazenamento CSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2 Configurações da matriz 𝐴 e fill-in . . . . . . . . . . . . . . . . . . . . . . 12
3.3 Grafo, Matriz e Reordenamento . . . . . . . . . . . . . . . . . . . . . . . . 16
4.1 Exemplo de execução do Algoritmo 5 . . . . . . . . . . . . . . . . . . . . . 18
4.2 Terminologia do algoritmo Sloan . . . . . . . . . . . . . . . . . . . . . . . 19
4.3 Grafo rerrotulado - RCM . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.4 Grafo rerrotulado - Espectral . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.5 Bisseção de 𝐺: Vértices separadores 𝑆 e partições 𝐴 e 𝐵 . . . . . . . . . . 25
4.6 Exemplo de Grafo de Eliminação . . . . . . . . . . . . . . . . . . . . . . . 26
4.7 Funcionamento dos algoritmos de Grau Mínimo . . . . . . . . . . . . . . . 26
5.1 𝑟𝑎𝑖𝑙_5177 - Esparsidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.2 𝑟𝑎𝑖𝑙_5177 - Preenchimento . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.3 𝑟𝑎𝑖𝑙_5177 - Iterações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.4 𝑟𝑎𝑖𝑙_5177 - Tempo de CPU . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.5 𝑎𝑓𝑡01 - Esparsidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.6 𝑎𝑓𝑡01 - Preenchimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.7 𝑎𝑓𝑡01 - Iterações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.8 𝑎𝑓𝑡01 - Tempo de CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.9 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1 - Esparsidade . . . . . . . . . . . . . . . . . . . . . 37
5.10 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1 - Preenchimento . . . . . . . . . . . . . . . . . . . . 38
5.11 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1 - Iterações . . . . . . . . . . . . . . . . . . . . . . . 38
5.12 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1 - Tempo de CPU . . . . . . . . . . . . . . . . . . . 39
5.13 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾 - Esparsidade . . . . . . . . . . . . . . . . . . . . . . . 40
5.14 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾 - Preenchimento . . . . . . . . . . . . . . . . . . . . . . 41
5.15 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾 - Iterações . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.16 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾 - Tempo de CPU . . . . . . . . . . . . . . . . . . . . . 42
5.17 𝐵𝑎𝑢𝑚𝑎𝑛𝑛 - Esparsidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.18 𝐵𝑎𝑢𝑚𝑎𝑛𝑛 - Preenchimento . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.19 𝐵𝑎𝑢𝑚𝑎𝑛𝑛 - Iterações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.20 𝐵𝑎𝑢𝑚𝑎𝑛𝑛 - Tempo de CPU . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.21 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2 - Esparsidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.22 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2 - Preenchimento . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.23 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2 - Iterações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.24 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2 - Tempo de CPU . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.25 𝑏𝑜𝑛𝑒𝑆01 - Esparsidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.26 𝑏𝑜𝑛𝑒𝑆01 - Preenchimento . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.27 𝑏𝑜𝑛𝑒𝑆01 - Iterações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.28 𝑏𝑜𝑛𝑒𝑆01 - Tempo de CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Lista de Tabelas
4.1 Exemplo de execução - RCM . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2 Exemplo de execução - Espectral . . . . . . . . . . . . . . . . . . . . . . . 24
5.1 Características das matrizes testadas . . . . . . . . . . . . . . . . . . . . . 29
5.2 Medições - 𝑟𝑎𝑖𝑙_5177 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.3 Medições - 𝑎𝑓𝑡01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.4 Medições - 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1 . . . . . . . . . . . . . . . . . . . . . . . 37
5.5 Medições - 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾 . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.6 Medições - 𝐵𝑎𝑢𝑚𝑎𝑛𝑛 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.7 Medições - 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.8 Medições - 𝑏𝑜𝑛𝑒𝑆01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.1 Análise Final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Sumário
1 Introdução 1
2 Sistemas Lineares 5
2.1 Resolução de Sistemas Lineares . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.1 Método do Resíduo Mínimo Generalizado (GMRES) . . . . . . . . 7
2.2 Precondicionadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.1 Fatoração LU incompleta (ILU) . . . . . . . . . . . . . . . . . . . . 9
3 Matrizes Esparsas 11
3.1 Armazenamento Otimizado . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Métricas de Minimização . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.1 Fill-in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.2 Largura de Banda . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.3 Envelope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3 Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.4 Permutação e Reordenamento . . . . . . . . . . . . . . . . . . . . . . . . . 15
4 Algoritmos de Reordenamento 17
4.1 Sloan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2 Reverse Cuthill McKee (RCM) . . . . . . . . . . . . . . . . . . . . . . . . 21
4.3 Espectral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.4 Nested Dissection (ND) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.5 Approximate Minimum Degree (AMD) . . . . . . . . . . . . . . . . . . . . 25
5 Testes Computacionais 29
5.1 Matriz 𝑟𝑎𝑖𝑙_5177 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.2 Matriz 𝑎𝑓𝑡01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.3 Matriz 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1 . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.4 Matriz 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾 . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.5 Matriz 𝐵𝑎𝑢𝑚𝑎𝑛𝑛 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.6 Matriz 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.7 Matriz 𝑏𝑜𝑛𝑒𝑆01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6 Conclusões 53
Referências Bibliográficas 56
A Implementações CSR 60
Capítulo 1
Introdução
No processo de solução numérica de muitas aplicações é comum recairmos na necessidade
de manipular matrizes de grande porte vinculadas a sistemas lineares. Tais aplicações
possuem milhares de variáveis, mas cada variável individual depende apenas de algumas
poucas, e por isso a maior parte dos coeficientes dessas matrizes são nulos. Dinâmicas
de fluidos computacionais, otimização, simulação de problemas físicos e químicos, grafos,
sistemas eletromagnéticos são exemplos de aplicações cujos processos de solução recaem
na necessidade de manipular matrizes esparsas.
Na Figura 1.1 podemos observar representações provenientes de um problema de
otimização. A matriz 𝑛𝑒𝑡125 de Alexander Andrianov, SAS Institute Inc. (Timothy
A. Davis, 2013a) representada como um grafo não-direcionado (Figura 1.1a) e como uma
matriz esparsa (Figura 1.1b).
O uso de estruturas de dados otimizadas para armazenar matrizes esparsas visa re-
duzir a quantidade de memória usada e a quantidade de operações de ponto flutuante.
Tipos de armazenamentos como o Compressed Sparse Row (CSR) ou Compressed Sparse
Column (CSC) são exemplos de estruturas eficientes onde se armazenam apenas os ele-
mentos não nulos da matriz e consequentemente melhoram o desempenho dos algoritmos
que necessitam executar operações com matrizes esparsas.
Capítulo 1. Introdução 2
(a) Grafo não-direcionado (b) Matriz esparsa
Figura 1.1: Representações da matriz 𝑛𝑒𝑡125
Para solução de sistemas lineares de grande porte, Saad (2003) sugere a utilização de
métodos iterativos baseados em projeções de subespaços de Krylov por suas boas proprie-
dades numéricas e computacionais. Além disso, técnicas de precondicionamento baseadas
na decomposição LU incompleta (Benzi et al., 1999) (Camata et al., 2012) aceleram a
convergência e consequentemente melhoram a eficiência desses métodos na obtenção da
solução. Neste trabalho, iremos estudar classes de algoritmos de reordenamento que têm
como objetivo a redução do preenchimento (ou fill-in) que ocorre ao utilizarmos pre-
condicionador baseado na decomposição LU incompleta. Assim, diminui-se o número de
operações com ponto flutuante, melhorando o tempo de execução dos métodos iterativos
não estacionários.
Por fim, iremos comparar a eficiência de cada método quanto ao tempo de execução,
calculando o tempo gasto para resolver o sistema linear sem nenhum pré-processamento,
e o tempo para resolvê-lo após o pré-processamento, avaliando os resultados de acordo
com algumas métricas como Envelope, Largura de Banda e quantidade de preenchimento.
Poucos estudos têm sido feitos atualmente com relação a algoritmos de reordena-
mento. Artigos como Sloan (1986) e Sloan (1989), descrevem um algoritmo de reordena-
3
mento que parece ter sido pouco estudado, sem muitas outras referências na literatura.
Além disso, esses artigos possuem implementações de códigos antigos e pouco estrutura-
dos, na linguagem de programação FORTRAN. Dos artigos referenciados, a maior parte
se preocupa em estudar algoritmos individualmente, de forma que poucos estudos se pre-
ocupam em compará-los. Uma exceção é o estudo feito por Ghidetti (2011). Nele, a
autora compara algoritmos de reordenamentos também estudados neste trabalho, como
RCM e Espectral, além de outra abordagem do algoritmo Nested Dissection. Carmo
(2005) também compara a influência de algoritmos de reordenamento como o RCM e
AMD aplicados em matrizes esparsas no desempenho do método Cholesky controlado
gradiente conjugado.
Os capítulos estão divididos de forma a facilitar a compreensão do leitor. No se-
gundo capítulo, revisa-se alguns conceitos básicos sobre sistemas de equações lineares e
sobre métodos de resolução desses sistemas. No terceiro capítulo, apresenta-se matrizes
esparsas e as vantagens computacionais que podemos obter ao armazená-las adequada-
mente. No quarto capítulo, descreve-se sobre os algoritmos de reordenamento escolhidos
para estudo, com uma breve explicação do funcionamento de cada um deles. No quinto
capítulo, expõe-se os resultados obtidos através de testes computacionais, em uma aná-
lise detalhada de cada uma das matrizes testadas. No sexto capítulo, apresenta-se as
conclusões e considerações finais, sintetizando todos os resultados obtidos. Por fim, o
Apêndice A apresenta pseudocódigos em formato CSR de alguns algoritmos utilizados
neste trabalho.
Capítulo 2
Sistemas Lineares
Seja uma equação linear de 𝑛 incógnitas definida como 𝑎𝑖1𝑥1 + 𝑎𝑖2𝑥2 + ... + 𝑎𝑖𝑛𝑥𝑛 = 𝑏𝑖,
um sistema linear é um conjunto de 𝑚 equações lineares da forma
⎧⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎩
𝑎11𝑥1 + 𝑎12𝑥2 + ...+ 𝑎1𝑛𝑥𝑛 = 𝑏1
𝑎21𝑥1 + 𝑎22𝑥2 + ...+ 𝑎2𝑛𝑥𝑛 = 𝑏2...
𝑎𝑚1𝑥1 + 𝑎𝑚2𝑥2 + ...+ 𝑎𝑚𝑛𝑥𝑛 = 𝑏𝑚
onde 𝑎𝑖𝑗 , 𝑏𝑖, para 1 ≤ 𝑖 ≤ 𝑚, 1 ≤ 𝑗 ≤ 𝑛, são números reais (ou complexos) chamados de
coeficientes do sistema.
Assim, podemos representar um sistema linear na forma matricial 𝐴𝑥 = 𝑏
⎛⎜⎜⎜⎜⎜⎜⎜⎝
𝑎11 𝑎12 · · · 𝑎1𝑛
𝑎21 𝑎22 · · · 𝑎2𝑛...
......
𝑎𝑚1 𝑎𝑚2 · · · 𝑎𝑚𝑛
⎞⎟⎟⎟⎟⎟⎟⎟⎠.
⎛⎜⎜⎜⎜⎜⎜⎜⎝
𝑥1
𝑥2...
𝑥𝑛
⎞⎟⎟⎟⎟⎟⎟⎟⎠=
⎛⎜⎜⎜⎜⎜⎜⎜⎝
𝑏1
𝑏2...
𝑏𝑚
⎞⎟⎟⎟⎟⎟⎟⎟⎠A matriz 𝐴 é chamada de matriz do sistema, o vetor coluna 𝑥 são as incógnitas do
sistema e o vetor coluna 𝑏 é o vetor de termos independentes (Boldrini et al., 1986).
Capítulo 2. Sistemas Lineares 6
Seja 𝐴 uma matriz. 𝐴 é dita quadrada se possui o mesmo número de linhas e colunas
(𝑚 = 𝑛). 𝐴 é diagonal se 𝑎𝑖𝑗 = 0, para 𝑖 ̸= 𝑗. A matriz transposta de 𝐴, denotada
por 𝐴𝑇 , é uma matriz onde 𝑎𝑖𝑗 = 𝑎𝑗𝑖. 𝐴 é chamada de matriz triangular superior (U)
se 𝑎𝑖𝑗 = 0 para 𝑖 > 𝑗 e, matriz triangular inferior (L) se 𝑎𝑖𝑗 = 0 para 𝑖 < 𝑗. 𝐴 é dita
identidade se 𝑎𝑖𝑗 = 1 quando 𝑖 = 𝑗 e 𝑎𝑖𝑗 = 0 quando 𝑖 ̸= 𝑗. 𝐴 é simétrica se 𝐴 = 𝐴𝑇 . 𝐴
é estruturalmente simétrica se, quando 𝑎𝑖𝑗 ̸= 0 então 𝑎𝑗𝑖 ̸= 0, mas não necessariamente
𝑎𝑖𝑗 = 𝑎𝑗𝑖. Seja um vetor 𝑣, 𝑣 ̸= 0, e um escalar 𝜆 ∈ R tais que 𝐴𝑣 = 𝜆𝑣, 𝜆 é um autovalor
de 𝐴 e 𝑣 um autovetor de 𝐴 associado a 𝜆 (Boldrini et al., 1986) (Saad, 2003).
2.1 Resolução de Sistemas Lineares
A solução de um sistema linear pode ser encontrada através de métodos Diretos ou
métodos Iterativos. Os métodos Diretos são capazes de encontrar a solução exata, sujeita
a erros de arredondamento, em um número finito de passos. Apesar disso, não são eficazes
quando aplicados em matrizes esparsas de grande porte.
O processo de encontrar a solução de uma matriz triangular superior ou inferior,
baseado na Eliminação de Gauss, é um exemplo de método Direto. Os cálculos envolvidos
nos Algoritmos 1 e 2 são triviais, sendo feitos através de substituições sucessivas (resolve
o sistema 𝐿𝑥 = 𝑐) ou retroativas (resolve o sistema 𝑈𝑥 = 𝑑).
Algoritmo 1: Substituição Sucessiva
1 𝑥1 = 𝑏1/𝑎112 𝑠𝑜𝑚𝑎 = 03 para 𝑖 = 2,...,𝑛 faça
4 𝑠𝑜𝑚𝑎 = 𝑏𝑖5 para 𝑗 = 1,...,𝑖 faça6 𝑠𝑜𝑚𝑎 = 𝑠𝑜𝑚𝑎− 𝑎𝑖𝑗𝑥𝑗7 fim
8 𝑥𝑖 = 𝑠𝑜𝑚𝑎/𝑎𝑖𝑖9 fim
7 2.1. Resolução de Sistemas Lineares
Algoritmo 2: Substituição Retroativa
1 𝑥𝑛 = 𝑏𝑛/𝑎𝑛𝑛2 𝑠𝑜𝑚𝑎 = 03 para 𝑖 = 𝑛− 1,...,1 faça4 𝑠𝑜𝑚𝑎 = 𝑏𝑖5 para 𝑗 = 𝑖+ 1,...,𝑛 faça
6 𝑠𝑜𝑚𝑎 = 𝑠𝑜𝑚𝑎− 𝑎𝑖𝑗𝑥𝑗7 fim
8 𝑥𝑖 = 𝑠𝑜𝑚𝑎/𝑎𝑖𝑖9 fim
Já os métodos Iterativos são técnicas mais eficazes para resolver sistemas lineares de
grandes porte. Essa classe de métodos depende de uma tolerância pré-fixada e propor-
cionam uma boa qualidade de solução quanto a erros de arredondamento, uma vez que
não alteram a matriz 𝐴 e o vetor 𝑏 no processo iterativo. (Saad, 2003).
Os métodos Iterativos dividem-se ainda em estacionários e não-estacionários. Os es-
tacionários possuem uma matriz de iteração constante, enquanto que os não-estacionários
procuram obter em cada iteração a melhor aproximação utilizando informações das ite-
rações anteriores. Eles se baseiam em projeções de subespaços de Krylov, formados a
partir de
𝐾𝑚(𝐴,𝑟0) = 𝑠𝑝𝑎𝑛{︀𝑟0,𝐴𝑟0,𝐴
2𝑟0,...,𝐴𝑚−1𝑟0
}︀(2.1)
onde 𝑚 é a dimensão do subespaço, 𝑟0 = 𝑏 − 𝐴𝑥0 e 𝑠𝑝𝑎𝑛{︀𝑟0,𝐴𝑟0,𝐴
2𝑟0,...,𝐴𝑚−1𝑟0
}︀representa a base geradora do subespaço vetorial 𝐾𝑚. Esses métodos têm como objetivo
transformar o sistema 𝐴𝑥 = 𝑏 em um problema de minimização do resíduo 𝑟 = 𝑏 − 𝐴𝑥,
para 𝑥 ∈ 𝐾𝑚.
2.1.1 Método do Resíduo Mínimo Generalizado (GMRES)
Ométodo do Resíduo Mínimo Generalizado (GMRES) desenvolvido por Saad and Schultz
(1986) é um método iterativo não-estacionário utilizado para determinar a solução apro-
ximada de um sistema linear da forma 𝐴𝑥 = 𝑏.
Capítulo 2. Sistemas Lineares 8
O algoritmo usa o processo de Arnoldi para calcular uma base ortonormal do subes-
paço de Krylov. A base ortonormal 𝑥𝑘 é dada por 𝑥0 + 𝑉 𝑦𝑘, onde 𝑉 é a matriz cujas
colunas são os vetores 𝑣𝑘 calculados pelo processo de Arnoldi. Já o vetor 𝑦𝑘 é obtido
pela solução do sistema 𝐻𝑘𝑦𝑘 = 𝛽𝑘𝑒1, onde 𝐻𝑘 é uma matriz superior chamada Hessen-
berg, cujos elementos são calculados durante a ortogonalização do processo de Arnoldi,
𝛽𝑘 = ‖𝑟0‖2, 𝑟0 = 𝑏−𝐴𝑥0 e 𝑒1 é o vetor canônico de dimensão 𝑘 (Gonçalez, 2005).
A fim de reduzir o número de operações de ponto flutuante e o armazenamento, o
algoritmo pode ser implementado considerando um número fixo de elementos na base.
Este procedimento é conhecido como reinicialização (ou restart) (Saad, 2003). A cada
𝑘 iterações é gerado um novo espaço vetorial de Krylov com 𝑘 elementos na base. Para
valores grandes de 𝑘, o método fica mais robusto e converge com menos iterações, en-
quanto que para valores pequenos de 𝑘, o método necessita de mais iterações, porém
cada iteração é menos custosa.
2.2 Precondicionadores
Com objetivo de acelerar a convergência dos métodos iterativos baseados em espaços de
Krylov, o precondicionamento consiste em encontrar uma matriz 𝑀 que seja simples de
construir e que reduza o número de iterações ao resolver um sistema linear. Um bom
precondicionador 𝑀 deve ser uma aproximação de 𝐴 que possa ser facilmente invertível,
de forma que utilizar 𝑀−1𝐴 ou 𝐴𝑀−1, ao invés de 𝐴 nas operações matriz × vetor,
melhore a convergência do método iterativo.
Para o precondicionamento do método GMRES consideramos neste trabalho o pre-
condicionador à esquerda. Algebricamente, considerando o sistema 𝐴𝑥 = 𝑏 e aplicando
o precondicionador, temos o sistema equivalente 𝑀−1𝐴𝑥 = 𝑀−1𝑏. No processo itera-
tivo, devemos agora adicionar a matriz precondicionada aos produtos matriz × vetor.
Portanto, ao invés de resolvermos 𝑣 = 𝐴𝑥, iremos resolver 𝑣 = 𝑀−1𝐴𝑥.
9 2.2. Precondicionadores
Esta operação é feita em duas etapas:
1. Calcula-se 𝑝 = 𝐴𝑥
2. Calcula-se 𝑣 = 𝑀−1𝑝, resolvendo o sistema 𝑀𝑣 = 𝑝.
Porém a matriz 𝑀 é decomposta em 𝐿𝑈 pela fatoração 𝐿𝑈 incompleta (seção 2.2.1).
Logo, resolver o sistema 𝑀𝑣 = 𝑝 equivale a resolver o sistema 𝐿𝑈𝑣 = 𝑝. Essa operação
também é feita em duas etapas:
1. Seja 𝑈𝑣 = 𝑥, calcula-se 𝐿𝑥 = 𝑝 por substituições sucessivas (Algoritmo 1)
2. Calcula-se 𝑈𝑣 = 𝑥 por substituições retroativas (Algoritmo 2)
2.2.1 Fatoração LU incompleta (ILU)
Dada uma matriz quadrada 𝐴, podemos decompô-la em uma matriz triangular superior
𝑈 e uma matriz triangular inferior 𝐿, onde 𝐴 = 𝐿𝑈 . Este método é conhecido como
fatoração 𝐿𝑈 .
Porém, construir um precondicionador𝑀 baseado na fatoração 𝐿𝑈 completa, de uma
matriz esparsa 𝐴, resultaria no preenchimento (fill-in) de muitas posições originalmente
nulas, isto é, muitos elementos nulos em 𝐴 seriam não nulos em 𝑀 . Assim, considerando
que um precondicionador precisa ser somente uma boa aproximação de 𝐴, podemos
utilizar uma fatoração aproximada 𝑀 = �̃��̃� ≈ 𝐴 chamada de fatoração incompleta.
Algoritmo 3: Fatoração ILU(0)
1 para 𝑖 = 2,...,𝑛 faça
2 para 𝑘 = 1,...,𝑖− 1 e 𝑎𝑖𝑘 ̸= 0 faça3 𝑎𝑖𝑘 = 𝑎𝑖𝑘/𝑎𝑘𝑘4 para 𝑗 = 𝑘 + 1,...,𝑛 faça
5 𝑎𝑖𝑗 = 𝑎𝑖𝑗 − (𝑎𝑖𝑘 * 𝑎𝑘𝑗)6 fim
7 fim
8 fim
Capítulo 2. Sistemas Lineares 10
O precondicionador ILU(0), descrito pelo Algoritmo 3, não admite preenchimentos em
nenhuma etapa da fatoração. Portanto �̃� e �̃� possuem o mesmo padrão de esparsidade
e a mesma quantidade de elementos não nulos de 𝐴.
Diferente do ILU(0) que somente permite computar a fatoração de elementos não
nulos, o ILU(p), descrito pelo Algoritmo 4, admite preenchimento até o nível 𝑝. Quando
𝑝 = 𝑛− 1 temos a fatoração 𝐿𝑈 completa. Além disso, a fatoração é menos exata e mais
rápida quanto menor o valor de 𝑝. Em termos de programação, é criada uma matriz
auxiliar 𝑙𝑒𝑣 que é inicializada no algoritmo como:
𝑙𝑒𝑣𝑖𝑗 =
{︂0 𝑎𝑖𝑗 ̸= 0
𝑛− 1 𝑐𝑎𝑠𝑜 𝑐𝑜𝑛𝑡𝑟�́�𝑟𝑖𝑜
Algoritmo 4: Fatoração ILU(p)
1 para todo 𝑎𝑖𝑗 ̸= 0 faça2 𝑙𝑒𝑣𝑖𝑗 = 03 fim
4 para 𝑖 = 2,...,𝑛 faça
5 para 𝑘 = 1,...,𝑖− 1 e 𝑎𝑖𝑘 ̸= 0 faça6 se 𝑙𝑒𝑣𝑖𝑗 ≤ 𝑝 então7 𝑎𝑖𝑘 = 𝑎𝑖𝑘/𝑎𝑘𝑘8 fim
9 para 𝑗 = 𝑘 + 1,...,𝑛 faça
10 𝑎𝑖𝑗 = 𝑎𝑖𝑗 − (𝑎𝑖𝑘 * 𝑎𝑘𝑗)11 𝑙𝑒𝑣𝑖𝑗 = 𝑚𝑖𝑛{𝑙𝑒𝑣𝑖𝑗 ,𝑙𝑒𝑣𝑖𝑘 + 𝑙𝑒𝑣𝑘𝑗 + 1}12 fim
13 fim
14 se 𝑙𝑒𝑣𝑖𝑗 > 𝑝 então15 𝑎𝑖𝑗 = 016 fim
17 fim
O algoritmo é similar ao ILU(0), porém a matriz auxiliar 𝑙𝑒𝑣 controla o nível de
preenchimento de cada elemento (linha 11 do Algoritmo 4). No final do algoritmo, na
linha 14, se o nível de preenchimento do elemento 𝑖𝑗 for maior do que o 𝑝 dado como
entrada, esse elemento é zerado.
Capítulo 3
Matrizes Esparsas
(Stoer and Bulirsch, 2002) define uma matriz esparsa como uma matriz onde a maioria
de seus elementos são nulos. (Saad, 2003) contesta que, na verdade, uma matriz é dita
esparsa quando podemos tirar vantagens da grande quantidade de zeros, uma vez que
estes não precisam ser armazenados. Para isso, é preciso definir estruturas de dados
adequadas para uma implementação eficiente de métodos de solução numéricos, sejam
eles diretos ou iterativos.
3.1 Armazenamento Otimizado
Uma forma de reduzir os gastos computacionais de operações em matrizes esparsas é
otimizar a forma de armazenamento dessa matriz. Neste trabalho utiliza-se o método
chamado Compress Sparse Row (CSR). No armazenamento CSR tradicional substitui-se
o armazenamento denso da matriz 𝐴, por três vetores auxiliares: 𝐴𝐴, 𝐽𝐴 e 𝐼𝐴. O vetor
𝐴𝐴 armazena todas as contribuições não nulas da matriz 𝐴 linha a linha. O vetor 𝐽𝐴
armazena a coluna correspondente que cada coeficiente não nulo ocuparia em 𝐴. Já o
vetor 𝐼𝐴 diz a posição em 𝐴𝐴 do primeiro elemento não nulo de cada linha de 𝐴 com
seu último elemento sendo igual ao número de elementos não nulos acrescido de um.
Capítulo 3. Matrizes Esparsas 12
Figura 3.1: Armazenamento CSR
3.2 Métricas de Minimização
3.2.1 Fill-in
O processo de fatoração 𝐿𝑈 quando aplicado em uma matriz esparsa tende a preencher
muitos elementos nulos, diminuindo consideravelmente o grau de esparsidade da ma-
triz. Com isso, o tempo computacional para resolver o sistema por um método iterativo
não-estacionário com precondicionador pode aumentar muito, uma vez que precisamos
calcular os fatores �̃� e �̃� da matriz precondicionada 𝑀 como visto na seção 2.2.1.
Várias heurísticas, baseadas simplesmente na troca de linhas e colunas, foram cria-
das para reduzir o preenchimento (ou fill-in) das matrizes. Algoritmos como o Nested
Dissection ou de Grau Mínimo visam simplesmente reduzir o fill-in, enquanto que RCM,
Sloan e Espectral tentam aproximar os elementos não-nulos da diagonal principal, o que
consequentemente também causa redução do fill-in.
⎛⎜⎜⎜⎜⎝× × × × ×× ×× ×× ×× ×
⎞⎟⎟⎟⎟⎠(a)
⎛⎜⎜⎜⎜⎝× × × × ×× × � � �× � × � �× � � × �× � � � ×
⎞⎟⎟⎟⎟⎠(b)
⎛⎜⎜⎜⎜⎝× ×× ×× ×× ×
× × × × ×
⎞⎟⎟⎟⎟⎠(c)
⎛⎜⎜⎜⎜⎝× ×× ×× ×× ×
× × × × ×
⎞⎟⎟⎟⎟⎠(d)
Figura 3.2: A configuração da matriz em (a) causa muito preenchimento, representadopor � em (b). Em (c), a simples troca das linhas e colunas 1 e 5 de (a), reduz opreenchimento a zero na matriz em (d).
13 3.2. Métricas de Minimização
3.2.2 Largura de Banda
Seja 𝐴 uma matriz estruturalmente simétrica, a largura de banda de 𝐴 é definida como:
𝑙𝑏(𝐴) = max𝑖=1,..,𝑛
{𝑏𝑖}
𝑏𝑖 = (𝑖− 𝑗) ∀ 𝑎𝑖𝑗 ̸= 0, 𝑖 = 1,...,𝑛
ou seja, a largura de banda pode ser definida como a maior distância entre o primeiro
elemento não-nulo da linha 𝑖 até a diagonal principal (Alan George, 1994).
Exemplo: 𝐴 =
⎛⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎝
× × ×× ×
× × ×× × ×
× × ×× × ×
× × ×× × × × ×
× × × ×× × ×
⎞⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎠→ 𝑙𝑏(𝐴) = 7
3.2.3 Envelope
Seja 𝐴 uma matriz estruturalmente simétrica, o envelope de 𝐴 é definido como:
𝑒𝑛𝑣(𝐴) =
𝑛∑︁𝑖=1
𝑏𝑖
Assim, podemos definir o envelope como a soma das distâncias entre o primeiro elemento
não-nulo de cada linha 𝑖 até a diagonal principal (Alan George, 1994).
Capítulo 3. Matrizes Esparsas 14
Exemplo: 𝐴 =
⎛⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎝
× × ×× ×
× × ×× × ×
× × ×× × ×
× × ×× × × × ×
× × × ×× × ×
⎞⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎠→ 𝑒𝑛𝑣(𝐴) = 27
3.3 Grafos
Conceitos importantes em teoria de grafos são fundamentais para o entendimento deste
trabalho e dos algoritmos estudados. Isto porque o problema de reordenamento de ma-
trizes pode ser visto como um problema de rerrotulação em grafos.
Seja 𝐺 = (𝑉,𝐸) um grafo formado pelos vértices 𝑉 = {𝑣1,𝑣2,𝑣3,...,𝑣𝑛} e um conjunto
de arestas 𝐸 = {𝑒1,𝑒2,𝑒3,...,𝑒𝑛}, dizemos que um vértice é adjacente a outro se há uma
aresta que é incidente nesses dois vértices. O conjunto de vizinhos de um vértice consiste
de todos os vértices adjacentes a ele. O número de vizinhos de 𝑣 ∈ 𝑉 (𝐺) designa-se grau
do vértice 𝑣, denotado por 𝑑𝐺(𝑣).
Considere o subconjunto de vértices 𝑋 = 𝑥1,𝑥2,...,𝑥𝑛 ⊆ 𝑉 (𝐺) e suponha que a aresta
𝑥𝑖𝑥𝑖+1 ∈ 𝐸(𝐺) para todo 𝑖 ∈ 1,2,...,𝑘 − 1. Se os vértices de 𝑋 são todos distintos, diz-se
que 𝑋 define um caminho. Um ciclo é um caminho com mesmo vértice final e inicial.
Um grafo é dito conexo se possui um caminho entre qualquer par de vértices. Uma árvore
é um grafo conexo sem ciclos. Definimos estrutura de nível 𝐸𝑁(𝑣) = 𝑁1, 𝑁2,...,𝑁𝑘 uma
árvore com níveis denotados por 𝑁1, 𝑁2,...,𝑁𝑘.
Seja 𝑣,𝑤 ∈ 𝑉 (𝐺), denomina-se distância 𝑑(𝑣,𝑤) de um grafo como sendo o com-
primento do menor caminho entre 𝑣 e 𝑤. A excentricidade de um vértice 𝑣 é a maior
distância de 𝑣 a todos os outros vértices de 𝐺. Definimos diâmetro de 𝐺 como sendo a
15 3.4. Permutação e Reordenamento
maior excentricidade do grafo 𝐺 e o pseudo-diâmetro é uma excentricidade alta de 𝐺,
porém não necessariamente a maior. Dado um grafo 𝐺, os vértices periféricos de 𝐺 são
vértices cuja excentricidade é igual ao diâmetro de 𝐺. Vértices com altas excentricidades,
porém não necessariamente a maior definem os vértices pseudo-periféricos.
Dados dois grafos 𝐻 e 𝐺, diz-se que 𝐻 é um subgrafo de 𝐺 quando 𝑉 (𝐻) ⊆ 𝑉 (𝐺) e
𝐸(𝐻) ⊆ 𝐸(𝐺). Um grafo 𝐺 = (𝑉 (𝐺),𝐸(𝐺)) diz-se bipartido se seu conjunto de vértices
admite uma partição em subconjuntos 𝑉1 e 𝑉2 tal que não existem arestas que unem dois
vértices de 𝑉1 ou 𝑉2.
Definimos como matriz de adjacência de um grafo 𝐺, a matriz 𝐴𝐺 = 𝑎𝑖𝑗 , tal que
𝑎𝑖𝑗 =
{︂1 se 𝑖𝑗 ∈ 𝐸(𝐺)0 caso contrário
Por fim, a matriz Laplaciana 𝐿 de um grafo 𝐺 pode ser definida como 𝐿 = 𝐷 − 𝐴,
onde 𝐷 é uma matriz diagonal contendo os graus de cada vértice 𝑣𝑖 do grafo 𝐺 e 𝐴 é a
matriz de adjacência de 𝐺. Ou seja,
𝑙𝑖𝑗 =
⎧⎨⎩𝑔𝑟𝑎𝑢(𝑣𝑖) se 𝑖 = 𝑗−1 se 𝑖 ̸= 𝑗 e 𝑣𝑖 é adjacente a 𝑣𝑗0 caso contrário
3.4 Permutação e Reordenamento
Permutações de linhas e/ou colunas são operações muito utilizadas na manipulação de
matrizes. A técnica consiste em multiplicar a matriz original 𝐴 com uma matriz de
permutação 𝑃 , construída a partir da matriz identidade. Seja, por exemplo, 𝐴 uma
matriz 5× 5. A matriz 𝑃 correspondente a uma permutação das linhas 1 e 4 seria:
𝑃 =
⎛⎜⎜⎜⎜⎝0 0 0 1 00 1 0 0 00 0 1 0 01 0 0 0 00 0 0 0 1
⎞⎟⎟⎟⎟⎠Assim, a nova representação para o sistema linear é (𝑃𝐴𝑃 𝑇 )(𝑃𝑥) = 𝑃𝑏.
Capítulo 3. Matrizes Esparsas 16
O processo de reordenamento de uma matriz tem forte relação com conceitos de
grafos descritos na Seção 3.3, pois formam a base para a maioria dos algoritmos de re-
ordenamento. Assim, podemos representar a matriz como um grafo a fim de facilitar
a visualização e o entendimento desses algoritmos. O processo equivalente ao reorde-
namento da matriz consiste em rerrotular o grafo alterando os rótulos dos vértices sem
modificar sua estrutura de ligação. Quanto mais próximos são os valores dos rótulos dos
vértices no grafo, mais agrupados ficarão os elementos na matriz correspondente.
A Figura 3.3 mostra a relação entre o grafo, a matriz e os reordenamentos. O grafo
𝐺1 em (a) possui a matriz de adjacência 𝑀1 em (b). Note que, sem reordenamento,
𝑙𝑏(𝑀1) = 7 e 𝑒𝑛𝑣(𝑀1) = 27. Ao aplicarmos uma rerrotulação no grafo 𝐺2 em (c),
tem-se a matriz de adjacência 𝑀2 em (d), onde 𝑙𝑏(𝑀2) = 3 e 𝑒𝑛𝑣(𝑀2) = 14.
(a) Grafo 𝐺1 (b) Matriz de Adjacência𝑀1 de 𝐺1
(c) Grafo 𝐺2 (d) Matriz de Adjacência𝑀2 de 𝐺2
Figura 3.3: Grafo, Matriz e Reordenamento
Capítulo 4
Algoritmos de Reordenamento
Alguns dos algoritmos de reordenamento descritos abaixo necessitam encontrar um vér-
tice inicial. A escolha desse vértice impacta diretamente na qualidade da solução. Se-
gundo George and Liu (1979), vértices pseudo-periféricos geralmente produzem bons
resultados e por isso são boas escolhas de vértice inicial. O Algoritmo 5 constrói a estru-
tura de nível dos vértices, comparando a profundidade dessas estruturas, encontrando os
vértices mais distantes entre si.
Algoritmo 5: Escolha do vértice pseudo-periférico
1 Escolha um vértice 𝑠 de grau mínimo2 Construa a estrutura de nível de 𝑠: 𝐿(𝑠) = {𝑙1, 𝑙2,..., 𝑙ℎ(𝑠)}3 Ordene os vértices em 𝑙ℎ(𝑠) em ordem crescente de graus4 Percorra 𝑙ℎ(𝑠) ordenado e forme uma lista 𝑞 contendo um vértice de cada grau5 para cada 𝑥 ∈ 𝑞 faça6 Construa a estrutura de nível de 𝑥7 se ℎ(𝑥) > ℎ(𝑠) e 𝑤(𝑥) < 𝑤(𝑠) então8 𝑠 = 𝑥9 fim
10 fim
11 𝑠 é o vértice pseudo-periférico
Capítulo 4. Algoritmos de Reordenamento 18
No Algoritmo 5, ℎ é a profundidade da estrutura de nível, ou seja, o número total
de níveis da estrutura de nível. Já 𝑤 refere-se a máxima quantidade de vértices em
um determinado nível, dentre todos os níveis. A Figura 4.1, representa a estrutura de
nível do grafo ilustrado na Figura 3.3a na Seção 3.4, e exemplifica a escolha do vértice
pseudo-periférico.
(a) ℎ(2) = 6 e 𝑤(2) = 3 (b) ℎ(3) = 6 e 𝑤(3) = 2
Figura 4.1: Exemplo de execução do Algoritmo 5
O algoritmo inicia escolhendo o vértice de menor grau, o vértice 2, gerando sua
estrutura de nível representado em (a). Os vértices do último nível são ordenados por
grau e forma-se 𝑞 contendo um vértice de cada grau. Como o último nível possui os
vértices 3 e 7 com mesmo grau, vamos escolher apenas um deles, o 3.
O próximo passo então é gerar a estrutura de nível do vértice 3, representado em
(b), e comparar com a do vértice 2. A estrutura de nível dos vértices 2 e 3 possuem seis
níveis, portanto ℎ(2) = 6 e ℎ(3) = 6. Já a máxima quantidade de vértices 𝑤(2) = 3 em
𝑁5 e 𝑤(3) = 2. Logo, como ℎ(2) = ℎ(3), o algoritmo não satisfaz a condição no passo 7
e termina com 2 como vértice pseudo-periférico.
19 4.1. Sloan
4.1 Sloan
Proposto por Sloan (1986), o método visa reduzir o envelope e largura de banda de
matrizes esparsas estruturalmente simétricas, podendo ser eficientemente usado para ro-
tulação de malhas no método de elementos finitos. Segundo Sloan (1986), testes feitos
em uma coleção de matrizes coletadas por Everstine (1979) mostrou o Sloan sendo mais
eficiente do que métodos como Reverse Cuthill-McKee (George, 1971) e Gibbs (Gibbs
et al., 1976). Entretanto, essa coleção é muito antiga e possui matrizes que, atualmente,
podem ser consideradas de pequeno porte. Por isso a necessidade de novos testes em
uma coleção de matrizes de ordem maior, oriundas de problemas mais atuais.
Figura 4.2: Terminologia do Algoritmo Sloan
O algoritmo funciona atribuindo estados a cada vértice. Um vértice que ainda não
recebeu nenhuma rotulação recebe o estado chamado pós-ativo. Todo vértice que é adja-
cente a um vértice pós-ativo, mas não tem estado pós-ativo é definido com estado ativo.
Os vértices adjacentes a um vértice ativo, mas não possuem um estado ativo ou pós-ativo,
são definidos com estado pré-ativo. Já aqueles que não possuem estados ativo, pós-ativo
ou pré-ativo, são definidos como inativos (Figura 4.2).
Capítulo 4. Algoritmos de Reordenamento 20
A partir de dois vértices pseudo-periféricos, um vértice inicial e um vértice final dados
como entrada, é criado uma fila de prioridades. Essa fila, formada apenas por vértice
ativos ou pré-ativos, vai sendo atualizada com informações do grafo e o vértice com a
maior prioridade é o próximo a ser escolhido para receber o novo rótulo. A prioridade de
cada vértice se relaciona com o estado desse vértice e com sua distância até o vértice final.
Por fim, após todos os vértices serem escolhidos e rerrotulados, o processo é finalizado.
O Algoritmo 6 descreve os passos para o reordenamento de uma matriz como apre-
sentado em Sloan (1986) e Sloan (1989). Ainda segundo Sloan (1989), testes empíricos
sobre grandes coleções de problemas sugerem que, atribuindo 𝑊1 = 1 e 𝑊2,= 2, conse-
guimos obter bons reordenamentos. Porém, apesar deste trabalho seguir a sugestão de
Sloan (1989) com 𝑊1 = 1 e 𝑊2 = 2, alguns testes empíricos com outros valores de 𝑊1
e 𝑊2 melhoraram a qualidade da solução. Portanto, seria necessário um estudo mais
aprofundando sobre a escolha desses parâmetros.
Algoritmo 6: Sloan
1 Entre com os vértices pseudo-periféricos, o vértice inicial 𝑠 e o vértice final 𝑒2 Gere a estrutura de nível do vértice final, 𝐸𝑁(𝑒) = {𝑙1,𝑙2,...,𝑙ℎ(𝑒)}, e construa umvetor de distâncias 𝛿𝑖 de cada vértice 𝑖 até o vértice final. Note que se o vértice 𝑖se encontra no nível 𝑗 de 𝐿(𝑒), então 𝛿𝑖 = 𝑗 − 1
3 Para cada vértice do grafo, atribua estado inativo e prioridade inicial, 𝑃𝑖, sendo𝑃𝑖 ←𝑊1 * 𝛿𝑖 −𝑊2 * (𝑑𝑖 + 1)
4 Insira 𝑠 na fila de vértices a serem escolhidos e atribua e ele estado pré-ativo5 Enquanto a fila não estiver vazia, faça os passos 6-96 Procure na fila de vértices a serem escolhidos o vértice 𝑖 de maior prioridade7 Exclua o vértice 𝑖 da fila. Se 𝑖 não for pré-ativo, vá para o passo 8. Caso contrário,examine cada vértice 𝑗 que é adjacente a 𝑖 e faça 𝑃𝑗 = 𝑃𝑗 +𝑊2. Se 𝑗 for inativo,insira 𝑗 na fila de vértices a serem escolhidos e atribua a ele estado pré-ativo
8 Atribua ao vértice 𝑖 um novo rótulo e dê a ele estado pós-ativo9 Examine cada vértice 𝑗 que é adjacente a 𝑖. Se 𝑗 não for pré-ativo, não faça nada.Caso contrário, faça 𝑃𝑗 = 𝑃𝑗 +𝑊2, atribua a 𝑗 estado ativo e examine cadavértice 𝑘 adjacente a 𝑗. Se 𝑘 for ativo ou pré-ativo, faça 𝑃𝑘 = 𝑃𝑘 +𝑊2. Casocontrário, se 𝑘 for inativo, faça 𝑃𝑘 = 𝑃𝑘 +𝑊2, insira 𝑘 na fila de vértices a seremescolhidos, e atribua a ele estado pré-ativo
10 Termine com uma nova ordenação de vértices
21 4.2. Reverse Cuthill McKee (RCM)
4.2 Reverse Cuthill McKee (RCM)
Proposto por Cuthill and McKee (1969), o algoritmo Cuthill Mckee é um método de re-
ordenamento aplicado a matrizes esparsas para redução do envelope e largura de banda.
Estudos feitos posteriormente por George (1971) mostraram que a solução do Cuthill
Mckee pode ser melhorada simplesmente invertendo a ordem de numeração. Foi então
definido o Reverse Cuthill Mckee, que passou a ser umas das heurísticas mais utiliza-
das para o problema de minimização da largura de banda e do envelope devido a boa
qualidade de solução, o baixo tempo de execução e a facilidade de implementação.
O Algoritmo 7 tenta rotular os vértices de maneira que os nós adjacentes recebam
rótulos da forma mais ordenada possível. Recebendo como entrada um grafo, ele percorre-
o a partir de um vértice inicial e caminha pelos vértices adjacentes em ordem crescente
de graus. A qualidade da solução do RCM depende criticamente da escolha do vértice
inicial. George and Liu (1979) mostrou que vértices com altas excentricidades são boas
escolhas. O Algoritmo 5 descreve os passos para encontrar os vértices pseudo-periféricos.
Algoritmo 7: Reverse Cuthill Mckee
1 Encontrar um vértice inicial 𝑥2 para 𝑖 = 1,...,𝑛 faça
3 Encontrar todos os vértices adjacentes a 𝑖 que ainda não foram rerrotulados eatribuir a eles um novo rótulo por ordem crescente de graus
4 fim
5 Inverter a ordem de numeração
Uma maneira mais eficiente de implementar o RCM, descrito no Algoritmo 7, foi
proposto por Ghidetti (2011). A autora percebeu que o processo de percorrer os vértices
adjacentes do grafo em ordem crescente de graus é equivalente a uma busca em largura
neste grafo. Portanto, como o Algoritmo 5 já faz uma busca em largura para encontrar o
vértice inicial, basta guardar a estrutura de nível desse vértice e percorrer essa estrutura
em ordem crescente de graus. Esses passos estão descritos no Algoritmo 8.
Capítulo 4. Algoritmos de Reordenamento 22
Algoritmo 8: Reverse Cuthill Mckee
1 Encontrar um vértice inicial 𝑥 e sua respectiva estrutura de nível2 para 𝑖 = 1,...,𝑛 faça
3 Renumerar todos os vértices pertencentes ao nível 𝑖 da estrutura de nível de 𝑥em ordem crescente de graus
4 fim
5 Inverter a ordem de numeração
A Tabela 4.1 mostra um exemplo de execução do algoritmo RCM, aplicado no grafo
da Figura 3.3a. A primeira coluna refere-se a ordem de escolha dos vértices. A segunda
coluna refere-se a fila de vértices adjacentes. A última coluna mostra os novos rótulos
que cada vértice irá receber. Essa rerrotulação é mostrada na Figura 4.3.
Escolha Fila Novos rótulos
2 5 7 → 1
5 9 3 → 2
9 4, 8 6 → 3
4 8, 10 1 → 4
8 10, 1, 6 10 → 5
10 1, 6 8 → 6
1 6, 3 4 → 7
6 3, 7 9 → 8
3 7 5 → 9
7 - 2 → 10
Tabela 4.1: Exemplo de execução do RCM Figura 4.3: Grafo rerrotulado
4.3 Espectral
Proposto por Barnard et al. (1993), o algoritmo Espectral tem como principal objetivo re-
duzir o tamanho do envelope. O novo reordenamento é calculado a partir da permutação
do vetor de autovetores associado ao segundo menor autovalor 𝜆2 da matriz laplaciana
associada ao grafo.
23 4.3. Espectral
Segundo Fiedler (1973), o segundo menor autovalor 𝜆2 define a conectividade algé-
brica e seu autovetor associado tem relação com a distância entre os vértices do grafo.
Posteriormente Juvan and Mohar (1992) aplicou o uso desses autovetores para problemas
de minimização de largura de banda para reordenamentos.
A grande vantagem do algoritmo em relação a outros algoritmos de reordenamento
apresentados é a facilidade de implementá-lo em paralelo. Diferente do RCM ou do
Sloan que necessitam gerar estruturas de nível, o Espectral envolve apenas uma grande
quantidade de operações de ponto flutuante, tais como multiplicações e produtos de
matrizes, e por isso a implementação em paralelo pode ser feita sem esforço através de
métodos como Lanczos ou abordagens Multinível (Barnard et al., 1993).
Algoritmo 9: Espectral
1 Calcular o 2𝑜 menor autovalor da matriz laplaciana 𝐿 e o autovetor 𝑣 associado2 Ordenar 𝑣 em ordem crescente (ou decrescente)
A maior dificuldade na implementação do Algoritmo 9 é encontrar os autovalores e
autovetores de uma matriz, em particular, o segundo menor autovalor e seu autovetor
associado. Para isto, utiliza-se neste trabalho a biblioteca CHACO 2.2 (Hendrickson and
Leland, 2013) que implementa o algoritmo Multilevel Symmlq/RQI para o cálculo desses
autovalores e autovetores. Este algoritmo é baseado no método iterativo RQI (Rayleigh
Quocient Iteration) cuja qualidade da solução depende da tolerância escolhida.
O Algoritmo 9 apresenta algumas modificações com relação ao algoritmo definido em
Barnard et al. (1993). Na versão original, ordena-se o autovetor em ordem crescente
e decrescente, e em seguida escolhe-se o melhor resultado com relação a redução do
envelope. Entretanto, testes realizados em um conjunto de matrizes não mostrou uma
diferença considerável de redução e portanto, a fim de reduzir o tempo de CPU para esse
algoritmo, foi considerado apenas a ordenação decrescente do autovetor.
A Tabela 4.2 mostra um exemplo de execução do algoritmo Espectral, também apli-
cado no grafo da Figura 3.3a. A primeira coluna refere-se aos vértices e a segunda coluna
Capítulo 4. Algoritmos de Reordenamento 24
refere-se ao autovetor associado ao segundo menor autovalor da matriz Laplaciana do
grafo. Esse autovetor está ordenado decrescentemente e a nova ordem dos vértices define
os novos rótulos na terceira coluna. A rerrotulação é mostrada na Figura 4.4.
Vértice Autovetor Novos rótulos
2 0.610905 2 → 1
5 0.447214 5 → 2
9 0.163692 9 → 3
4 0.094507 4 → 4
10 0.000000 10 → 5
8 -0.094507 8 → 6
1 -0.258199 1 → 7
6 -0.258199 6 → 8
3 -0.352706 3 → 9
7 -0.352706 7 → 10
Tabela 4.2: Exemplo de execução do Espectral Figura 4.4: Grafo rerrotulado
4.4 Nested Dissection (ND)
O algoritmo Nested Dissection, proposto por George (1973), tem como objetivo reduzir
o preenchimento (fill-in) em fatorações de matrizes esparsas. Consiste em encontrar
um conjunto 𝑆 de vértices separadores de um grafo 𝐺, cuja remoção divide 𝐺 em dois
subgrafos disjuntos, 𝐴 e 𝐵. O subgrafo 𝐴 é rerrotulado primeiro, em seguida 𝐵, e por
último o conjunto de vértices separadores 𝑆. Assim, os vértices separadores são movidos
para o final da matriz, e o processo é aplicado recursivamente para 𝐴 e 𝐵.
Algoritmo 10: Nested Dissection
1 Particione 𝐺 = (𝑉,𝐸) em subgrafos 𝐴, 𝐵, e 𝑆2 Repita o passo 1 até que |𝐴|,|𝐵| ≤ 𝜖 ou |𝐴|,|𝐵| = 13 Obtenha a ordenação fazendo a recursão em pós-ordem, rerrotulando os vérticesde 𝐴, em seguida os de 𝐵 e por último os vértices de 𝑆
25 4.5. Approximate Minimum Degree (AMD)
Figura 4.5: Bisseção de 𝐺: Vértices separadores 𝑆 e partições 𝐴 e 𝐵
A complexidade do algoritmo é encontrar o conjunto de vértices separadores, que
divide 𝐺 em duas partições. Logo, um bom método para bisseção de 𝐺 impacta dire-
tamente na qualidade da solução. Este trabalho faz uso da biblioteca METIS (Karypis,
2013), que implementa heurísticas eficientes baseadas em algoritmos multinível (Karypis
and Kumar, 1998). A proposta desses algoritmos é reduzir o tamanho de 𝐺 eliminando
vértices e arestas, particionando-o em grafos menores. Em seguida essas partições são
refinadas e projetadas de volta ao grafo original (Hendrickson and Leland, 1995).
4.5 Approximate Minimum Degree (AMD)
Algoritmos de Grau Mínimo são heurísticas muito usadas para redução de preenchimento
(fill-in) da fatoração LU aplicadas em matrizes esparsas de grande porte. Muitos algorit-
mos baseados no Grau Mínimo surgiram nas últimas décadas como Quotient Minimum
Degree (George and Liu, 1981), Multiple Minimum Degree (Liu, 1985), e Approximate
Minimum Degree (Davis et al., 1994). Esses algoritmos baseiam-se na evolução do grau
dos vértices, eliminando a cada passo o vértice de menor grau, fazendo com que seus vi-
zinhos se tornem adjacentes. O novo grafo gerado pela remoção de um vértice é chamado
de Grafo de Eliminação, exemplificado na Figura 4.6.
Capítulo 4. Algoritmos de Reordenamento 26
(a) Grafo Original (b) Grafo de Eliminação
Figura 4.6: Exemplo de Grafo de Eliminação. O grafo original em (a) e o Grafo deEliminação em (b) criado após a remoção do vértice 1
Como tratamos os grafos através de suas matrizes de representação (adjacência),
eliminar o vértice de menor grau é equivalente a deslocar a coluna (da matriz reduzida)
com o menor número de elementos não nulos para a posição 𝑖. As linhas e colunas 1
até 𝑖 − 1 já estão ordenadas, portanto o número de elementos não nulos dessas linhas e
colunas é fixo, já que elas não serão mais acessadas (Figura 4.7).
Figura 4.7: Funcionamento dos algoritmos de Grau Mínimo
27 4.5. Approximate Minimum Degree (AMD)
O AMD usa técnicas baseadas em grafos quocientes que permite obter aproximações
com baixo custo computacional para o grau mínimo. Davis et al. (1994) mostra que
essas aproximações são frequentemente iguais ao grau do vértice, e melhoram o tempo
do algoritmo AMD com relação aos outros algoritmos de Grau Mínimo.
Neste trabalho a biblioteca de Timothy A. Davis (2013b), versão 2.3.1, implementa o
AMD. Algumas modificações foram feitas nesse código para permitir que os programas
tivessem a leitura e a saída compatíveis com as estruturas e códigos adotados no restante
das implementações.
Algoritmo 11: AMD
1 para 𝑖 = 1,...,𝑛 faça
2 Escolher um vértice 𝑣𝑖 de menor grau no Grafo de Eliminação 𝐺𝑖−1
3 Eliminar 𝑣𝑖 de 𝐺𝑖−1 para formar o novo Grafo de Eliminação 𝐺𝑖
4 fim
Capítulo 5
Testes Computacionais
Neste capítulo iremos comparar os resultados obtidos pelos testes computacionais. A
Tabela 5.1 apresenta as principais características de um conjunto de matrizes estrutu-
ralmente simétricas, mostrando o nome da matriz, o número de vetores 𝑘 usado no
GMRES, o número de elementos não-nulos 𝑛𝑛𝑧, a dimensão 𝑛 da matriz, a tolerância 𝜀
estabelecida no GMRES, a porcentagem de esparsidade da matriz calculada pela fórmula
𝑠𝑝𝑎(𝐴) = ((𝑛 * 𝑛)− 𝑛𝑛𝑧)/(𝑛 * 𝑛) * 100, e a área de aplicação.
Nome k nnz n 𝜀 spa(.) Área de Aplicação
RAIL_5177 200 35.185 5.177 10−10 99,87 Transferência de Calor
AFT01 50 125.567 8.205 10−10 99,81 Problema Acústico
FEM_3D_THERMAL1 5 430.740 17.880 10−10 99,87 Problema Térmico
THERMOMECH_TK 150 711.558 102.158 10−6 99,99 Problema Térmico
BAUMANN 200 748.331 112.211 10−10 99,99 Problema Químico
DUBCOVA2 20 1.030.225 65.025 10−10 99,97 Problema de EDP
BONES01 300 6.715.152 127.224 10−10 99.96 Modelagem 3D
Tabela 5.1: Características das matrizes testadas
Vale ressaltar que a tolerância usado no algoritmo Espectral foi de 10−4 para todas
as matrizes testadas. As matrizes estão no formato Matrix Market disponíveis nos re-
positórios da Universidade da Flórida em (Timothy A. Davis, 2013a). A tolerância 𝜀
Capítulo 5. Testes Computacionais 30
do GMRES foi escolhida de forma que a solução convergisse para o valor esperado. A
maioria das matrizes apresentadas tiveram boa qualidade de solução com 10−10, exceto
a matriz 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾 que foi suficiente a tolerância 10−6. Já a quantidade de ve-
tores na base 𝑘 foi escolhido empiricamente, buscando o menor tempo de execução do
GMRES. Por último, os testes foram realizados em um notebook com processador Intel
Core i5-460M 2.53GHz, com 4GB de memória RAM e sistema operacional Ubuntu 12.10.
Cada seção abaixo contém três páginas com informações e análises de cada matriz da
Tabela 5.1. A primeira página inicia-se com uma figura que mostra a esparsidade da ma-
triz após o reordenamento com cada um dos algoritmos. Em seguida, há uma tabela com
os valores do envelope, largura de banda da nova matriz gerada por cada algoritmo, além
do tempo de processamento (em segundos) desse algoritmo. Lembrando que, como os
algoritmos ND e AMD não são baseados na redução do envelope e largura de banda, esses
valores não são mostrados nessa tabela. Na segunda página, dois gráficos/tabelas apre-
sentam informações sobre a quantidade de elementos não-nulos criados (preenchimento)
e número de iterações gerados na execução do GMRES em seis níveis diferentes, para
cada algoritmo de reordenamento. Como não há preenchimento no nível 0, a respectiva
coluna não apresenta nenhum dado. Na terceira página, um último gráfico/tabela com o
tempo de processamento final (em segundos) para cada algoritmo em cada um dos níveis
de preenchimento seguido de uma sucinta análise. O tempo de processamento final mos-
trado equivale ao tempo de construção da matriz precondicionada + tempo de resolução
do algoritmo GMRES + tempo de execução do respectivo algoritmo de reordenamento.
O símbolo † significa que o algoritmo GMRES não convergiu. O critério decisivo
para a não-convergência foi a análise da redução do resíduo a cada iteração externa. Nas
tabelas de Tempo de CPU o símbolo ∙ indica o melhor resultado para cada nível de
preenchimento. Já o símbolo ∙ indica os tempos que não foram vantajosos, ou seja, o
tempo para resolver a matriz reordenada não foi melhor que o tempo para resolvê-la sem
reordenamento.
31 5.1. Matriz 𝑟𝑎𝑖𝑙_5177
5.1 Matriz 𝑟𝑎𝑖𝑙_5177
(a) Original (b) SLOAN (c) RCM
(d) ESPECTRAL (e) ND (f) AMD
Figura 5.1: Esparsidades da matriz 𝑟𝑎𝑖𝑙_5177
env(.) lb(.) Tempo de CPU
Original 6.082.739 5.147 -
Sloan 187.682 842 0,035
RCM 261.319 115 0,014
Espectral 237.296 323 0,043
ND - - 0,029
AMD - - 0,003
Tabela 5.2: Medições da matriz 𝑟𝑎𝑖𝑙_5177
Capítulo 5. Testes Computacionais 32
ILU(0) ILU(1) ILU(2) ILU(20) ILU(40) ILU(60)
S/ reord. - 47.046 82.934 805.104 1.323.816 1.471.592
Sloan - 5.768 15.358 217.214 313.080 341.922
RCM - 13.856 24.348 245.810 355.846 394.960
Espectral - 14.422 29.674 291.408 419.836 444.556
ND - 13.460 24.550 90.756 94.780 94.944
AMD - 12.958 22.614 79.728 82.968 83.130
Figura 5.2: Preenchimento da matriz 𝑟𝑎𝑖𝑙_5177
ILU(0) ILU(1) ILU(2) ILU(20) ILU(40) ILU(60)
S/ reord. 11420 169 102 16 7 3
Sloan 176 112 92 33 5 3
RCM 187 114 89 48 5 2
Espectral 188 115 95 92 21 1
ND 771 141 108 26 3 3
AMD 779 139 102 28 4 1
Figura 5.3: Iterações da matriz 𝑟𝑎𝑖𝑙_5177
33 5.1. Matriz 𝑟𝑎𝑖𝑙_5177
ILU(0) ILU(1) ILU(2) ILU(20) ILU(40) ILU(60)
S/ reord. 73,85 1,22 0,70 31,78 169,98 243,62
Sloan 1,08 ∙ 0,60 ∙ 0,49 0,78 1,40 1,78
RCM 1,18 0,62 0,47 ∙ 1,04 1,88 2,55
Espectral 1,22 0,66 0,55 1,92 3,20 2,58
ND 4,93 0,84 0,61 0,40 0,37 0,36
AMD 5,06 0,80 0,53 0,33 ∙ 0,28 ∙ 0,27 ∙
Figura 5.4: Tempo de CPU da matriz 𝑟𝑎𝑖𝑙_5177
Analisando os algoritmos de reordenamento, a Tabela 5.2 nos mostra que o Sloan foi
o algoritmo que mais reduziu o envelope da matriz, porém foi o que reduziu menos a
largura de banda. Já o RCM teve uma ótima qualidade de redução da largura de banda
e o pior resultado de envelope. O Espectral teve uma solução intermediária. Com relação
ao tempo de CPU, o AMD foi o mais rápido, enquanto o Espectral foi o mais lento.
Analisando os precondicionadores na Figura 5.2, podemos observar uma redução drás-
tica do preenchimento nos níveis 20, 40 e 60 para os algoritmos ND e AMD com relação
os demais algoritmos, o que não foi tão evidente nos níveis 0, 1 e 2. O preenchimento
neste caso impactou diretamente no tempo de CPU mostrado na Figura 5.4. Apesar de
todos os casos terem sido vantajosos, em comparação aos tempos sem reordenamento
nenhum, o ND e, em especial o AMD, se destacaram para ILU’s grandes enquanto que
o Sloan se destacou para ILU’s pequenos. O algoritmo AMD com ILU(60) produziu o
menor tempo de CPU.
Capítulo 5. Testes Computacionais 34
5.2 Matriz 𝑎𝑓𝑡01
(a) Original (b) SLOAN (c) RCM
(d) ESPECTRAL (e) ND (f) AMD
Figura 5.5: Esparsidades da matriz 𝑎𝑓𝑡01
env(.) lb(.) Tempo de CPU
Original 855.014 154 -
Sloan 666.979 735 0,082
RCM 760.155 247 0,056
Espectral 803.378 379 0,002
ND - - 0,063
AMD - - 0,003
Tabela 5.3: Medições da matriz 𝑎𝑓𝑡01
35 5.2. Matriz 𝑎𝑓𝑡01
ILU(0) ILU(1) ILU(2) ILU(10) ILU(20) ILU(30)
S/ reord. - 77.190 152.070 667.950 1.104.900 1.376.850
Sloan - 50.744 111.008 503.196 826.876 1.025.196
RCM - 50.744 108.924 518.464 878.632 1.110.540
Espectral - 78.650 172.986 830.138 1.298.146 1.465.700
ND - 111.284 204.066 432.674 483.260 492.796
AMD - 117.684 166.274 379.886 432.542 442.472
Figura 5.6: Preenchimento da matriz 𝑎𝑓𝑡01
ILU(0) ILU(1) ILU(2) ILU(10) ILU(20) ILU(30)
S/ reord. 358 94 44 15 9 7
Sloan 298 97 43 13 7 5
RCM 478 144 50 16 9 7
Espectral 351 93 41 13 7 5
ND 1050 297 106 19 8 3
AMD 1607 263 141 16 8 5
Figura 5.7: Iterações da matriz 𝑎𝑓𝑡01
Capítulo 5. Testes Computacionais 36
ILU(0) ILU(1) ILU(2) ILU(10) ILU(20) ILU(30)
S/ reord. 2,14 0,96 0,80 3,82 12,22 22,23
Sloan 1,91 ∙ 1,00 ∙ 0,77 ∙ 2,34 ∙ 6,27 10,74
RCM 2,92 ∙ 1,30 ∙ 0,80 2,47 7,31 13,42
Espectral 2,11 0,97 ∙ ∙ 0,85 ∙ 6,80 ∙ 20,20 ∙ 28,48 ∙
ND 6,35 ∙ 2,74 ∙ 1,71 ∙ 3,04 4,13 4,30
AMD 9,58 ∙ 2,48 ∙ 1,76 ∙ 2,50 3,68 ∙ 4,09 ∙
Figura 5.8: Tempo de CPU da matriz 𝑎𝑓𝑡01
Podemos perceber na Tabela 5.3 que os algoritmos Sloan, RCM e Espectral reduziram
pouco o envelope. Já com relação a largura de banda, não houve reduções. Isto deve-se
ao fato da matriz já possuir os elementos não nulos bem próximos da diagonal principal,
como podemos notar na Figura 5.5a.
Com isso, o preenchimento na Figura 5.6 também não apresentou reduções muito
grandes, com exceção do ND e AMD nos níveis de preenchimento 10 e 20. O Espectral
não foi capaz de reduzir o preenchimento em nenhum nível, enquanto o Sloan e RCM
tiveram reduções moderadas.
O número de iterações na Figura 5.7 foi desvantajoso na maioria das vezes. Já o tempo
de CPU na Figura 5.8 passou a obter melhores resultados nos níveis de preenchimento
maiores. O ND e AMD tiveram os melhores tempos nos níveis 10 e 20 e o Espectral,
provavelmente devido ao alto preenchimento, foi desvantajoso em todos os casos. O
algoritmo SLOAN com ILU(2) produziu o menor tempo de CPU.
37 5.3. Matriz 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1
5.3 Matriz 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1
(a) Original (b) SLOAN (c) RCM
(d) ESPECTRAL (e) ND (f) AMD
Figura 5.9: Esparsidades da matriz 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1
env(.) lb(.) Tempo de CPU
Original 11.445.306 13.787 -
Sloan 4.544.347 1.459 0,414
RCM 4.749.868 683 0,243
Espectral 4.965.437 703 0,110
ND - - 0,248
AMD - - 0,004
Tabela 5.4: Medições da matriz 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1
Capítulo 5. Testes Computacionais 38
ILU(0) ILU(1) ILU(2) ILU(3) ILU(4) ILU(10)
S/ reord. - 506.308 1.159.012 1.900.916 2.667.348 6.791.596
Sloan - 482.840 1.123.284 1.832.960 2.561.460 3.245.652
RCM - 485.368 1.106.022 1.804.328 2.520.478 6.497.798
Espectral - 499.950 1.185.736 1.991.768 2.809.940 7.194.790
ND - 703.240 1.483.266 2.288.314 2.814.588 4.516.090
AMD - 716.224 1.384.644 2.164.284 2.773.006 5.952.004
Figura 5.10: Preenchimento da matriz 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1
ILU(0) ILU(1) ILU(2) ILU(3) ILU(4) ILU(10)
S/ reord. 10 7 6 5 4 3
Sloan 12 8 5 4 2 1
RCM 15 9 6 5 4 2
Espectral 12 8 5 4 3 1
ND 25 15 12 9 8 3
AMD 28 14 11 7 7 3
Figura 5.11: Iterações da matriz 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1
39 5.3. Matriz 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1
ILU(0) ILU(1) ILU(2) ILU(3) ILU(4) ILU(10)
S/ reord. 0,63 2,72 7,74 20,13 43,38 444,29
Sloan 1,08 ∙ 2,96 ∙ 7,12 16,73 34,48 ∙ 397,83
RCM 0,97 ∙ 2,82 ∙ 6,99 ∙ 16,53 ∙ 34,84 465,32 ∙
Espectral 0,78 ∙ ∙ 2,76 ∙ ∙ 7,63 20,28 ∙ 44,11 ∙ 613,41 ∙
ND 1,07 ∙ 5,27 ∙ 16,76 ∙ 44,87 ∙ 77,37 ∙ 369,46 ∙
AMD 0,84 ∙ 4,83 ∙ 13,20 ∙ 39,69 ∙ 78,52 ∙ 902,20 ∙
Figura 5.12: Tempo de CPU da matriz 𝐹𝐸𝑀_3𝐷_𝑡ℎ𝑒𝑟𝑚𝑎𝑙1
Analisando a Tabela 5.4, o Sloan teve a melhor redução de envelope e pior redução
de largura de banda. Foi também o algoritmo que teve o maior tempo computacional.
Com relação ao preenchimento na Figura 5.10, podemos perceber pouca redução em
relação a matriz sem reordenamentos. O ND e o AMD foram vantajosos apenas em
ILU(10), enquanto o Espectral apenas em ILU(1). O Sloan e o RCM tiveram comporta-
mento semelhante até ILU(4), e em ILU(10) o Sloan reduz o preenchimento em mais da
metade comparado com o RCM.
As iterações na Figura 5.11 tem comportamento bem coerente. Apesar disso, os
tempos de processamento na Figura 5.12 não foram muito vantajosos, principalmente
em ILU(0) e ILU(1). Apenas nos níveis 2, 3 e 4 o Sloan e o RCM conseguem reduzir um
pouco o tempo final. Em ILU(10) o ND passou a ter o melhor resultado, mesmo tendo
gerado mais preenchimento que o Sloan, e ter convergido em mais iterações. Contudo,
observamos que o menor tempo de CPU ocorre em ILU(0) na matriz sem reordenamentos.
Capítulo 5. Testes Computacionais 40
5.4 Matriz 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾
(a) Original (b) SLOAN (c) RCM
(d) ESPECTRAL (e) ND (f) AMD
Figura 5.13: Esparsidades da matriz 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾
env(.) lb(.) Tempo de CPU
Original 2.667.823.445 102.138 -
Sloan 16.072.717 676 2,112
RCM 17.882.411 253 0,581
Espectral 14.635.485 389 2,738
ND - - 0,863
AMD - - 0,192
Tabela 5.5: Medições da matriz 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾
41 5.4. Matriz 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾
ILU(0) ILU(4) ILU(8) ILU(12) ILU(16) ILU(20)
S/ reord. - 2.418.982 6.234.694 11.386.296 17.735.910 25.168.278
Sloan - 1.299.766 2.794.478 4.281.708 5.745.876 7.175.972
RCM - 1.377.086 3.012.390 4.648.154 6.261.578 7.840.310
Espectral - 1.416.644 3.031.658 4.619.810 6.168.354 7.666.906
ND - 1.594.042 2.563.166 3.137.532 3.530.792 3.833.678
AMD - 1.505.844 2.445.502 3.118.058 3.636.438 4.055.210
Figura 5.14: Preenchimento da matriz 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾
ILU(0) ILU(4) ILU(8) ILU(12) ILU(16) ILU(20)
S/ reord. † † 141 97 75 59
Sloan † 607 99 68 51 41
RCM † 748 100 68 51 42
Espectral † 606 98 66 51 41
ND † † 143 111 75 70
AMD † † 138 104 72 65
Figura 5.15: Iterações da matriz 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾
Capítulo 5. Testes Computacionais 42
ILU(0) ILU(4) ILU(8) ILU(12) ILU(16) ILU(20)
S/ reord. † † 95,87 244,41 797,94 2155,92
Sloan † 105,90 ∙ 44,07 45,71 50,32 ∙ 59,32 ∙
RCM † 123,45 43,45 ∙ 45,11 ∙ 52,04 63,24
Espectral † 107,80 45,45 47,09 54,03 64,46
ND † † 52,72 51,90 54,73 59,82
AMD † † 55,94 55,47 57,61 66,34
Figura 5.16: Tempo de CPU da matriz 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾
É interessante observar as esparsidades de cada matriz reordenada na Figura 5.13. Os
algoritmos Sloan, RCM e Espectral foram capazes de aproximar os elementos não nulos
bastante dispersos em 5.13a para perto da diagonal principal em 5.13b, 5.13c e 5.13d.
Com relação a Tabela 5.5, podemos destacar o Espectral com melhor redução do
envelope, porém maior tempo de CPU, e o RCM com melhor redução de largura de
banda e pior redução de envelope.
Todos os algoritmos reduziram consideravelmente o preenchimento na Figura 5.14,
mantendo um comportamento bem semelhante ao longo dos ILU’s. Quanto as iterações
(Figura 5.15) e tempo de CPU (Figura 5.16) percebemos que as matrizes geradas pelos
algoritmos não convergem para o ILU(0). A não-convergência se mantém em ILU(4) para
o ND e AMD, passando a convergir com o Sloan, RCM e Espectral. Destaque para todos
os tempos terem sido vantajosos, sendo o melhor resultado para o RCM em ILU(8).
43 5.5. Matriz 𝐵𝑎𝑢𝑚𝑎𝑛𝑛
5.5 Matriz 𝐵𝑎𝑢𝑚𝑎𝑛𝑛
(a) Original (b) SLOAN (c) RCM
(d) ESPECTRAL (e) ND (f) AMD
Figura 5.17: Esparsidades da matriz 𝐵𝑎𝑢𝑚𝑎𝑛𝑛
env(.) lb(.) Tempo de CPU
Original 123.444.210 1.111 -
Sloan 82.970.162 1.086 11,074
RCM 82.970.162 1.086 0,056
Espectral 95.022.625 2.210 3,656
ND - - 1,191
AMD - - 0,174
Tabela 5.6: Medições da matriz 𝐵𝑎𝑢𝑚𝑎𝑛𝑛
Capítulo 5. Testes Computacionais 44
ILU(0) ILU(1) ILU(2) ILU(3) ILU(4) ILU(5)
S/ reord. - 624.000 1.605.400 3.501.600 6.021.000 9.076.800
Sloan - 624.000 1.605.400 2.756.986 4.198.838 5.784.542
RCM - 624.000 1.605.400 2.756.986 4.198.838 5.784.542
Espectral - 648.546 1.588.858 3.301.846 5.461.180 7.936.288
ND - 907.156 1.247.136 2.685.224 3.282.956 5.036.818
AMD - 935.080 939.692 2.662.204 2.669.012 4.901.296
Figura 5.18: Preenchimento da matriz 𝐵𝑎𝑢𝑚𝑎𝑛𝑛
ILU(0) ILU(1) ILU(2) ILU(3) ILU(4) ILU(5)
S/ reord. 181 183 179 160 † 175
Sloan 181 147 † † 391 143
RCM † 169 70 57 50 69
Espectral † 140 143 125 74 42
ND † † † 394 326 92
AMD † † † 176 176 102
Figura 5.19: Iterações da matriz 𝐵𝑎𝑢𝑚𝑎𝑛𝑛
45 5.5. Matriz 𝐵𝑎𝑢𝑚𝑎𝑛𝑛
ILU(0) ILU(1) ILU(2) ILU(3) ILU(4) ILU(5)
S/ reord. 23,38 57,73 79,39 87,9 † 148,95
Sloan 34,45 ∙ ∙ 60,66 ∙ † † 180,63 97,11
RCM † 54,27 ∙ 46,43 ∙ 44,99 ∙ 50,83 ∙ 58,66∙
Espectral † 63,67 ∙ 66,84 58,91 64,61 69,92
ND † † † 123,29 ∙ 111,84 73,56
AMD † † † 75,25 76,59 76,63
Figura 5.20: Tempo de CPU da matriz 𝐵𝑎𝑢𝑚𝑎𝑛𝑛
Analisando a Tabela 5.6, os algoritmos RCM e o Sloan tiveram a mesma qualidade
com relação a redução do envelope e largura de banda, porém o tempo de execução do
Sloan foi de 184.5 vezes maior.
As Figuras 5.19 e 5.20 revelam um comportamento peculiar e fora do esperado. A
matriz reordenada com Sloan, após convergir em ILU(1), passa a não convergir em ILU(2)
e ILU(3). O mesmo ocorre com a matriz sem reordenamentos em ILU(4). O melhor
tempo de CPU foi do RCM, apesar do ND e AMD possuírem o menor preenchimento.
Uma consideração importante é o fato de que apesar do Sloan e RCM possuírem a
mesma qualidade de solução, a convergência e tempo de CPU final da matriz com esses
reordenamentos foram discrepantes. Isso sugere que um reordenamento pode alterar
muito o condicionamento da matriz. Para essa matriz, os algoritmos de reordenamento
não reduziram o tempo final de execução. O menor tempo de CPU ocorreu em ILU(0)
na matriz sem reordenamentos.
Capítulo 5. Testes Computacionais 46
5.6 Matriz 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2
(a) Original (b) SLOAN (c) RCM
(d) ESPECTRAL (e) ND (f) AMD
Figura 5.21: Esparsidades da matriz 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2
env(.) lb(.) Tempo de CPU
Original 1.954.927.827 64.820 -
Sloan 21.887.637 1.008 3,571
RCM 22.075.139 1.012 2,320
Espectral 24.455.729 1.092 0,889
ND - - 0,794
AMD - - 0,040
Tabela 5.7: Medições da matriz 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2
47 5.6. Matriz 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2
ILU(0) ILU(1) ILU(2) ILU(3) ILU(4) ILU(5)
S/ reord. - 2.429.000 6.137.376 11.351.574 17.924.664 25.979.582
Sloan - 382.036 887.566 1.388.606 1.885.642 2.378.690
RCM - 382.036 888.064 1.390.084 1.888.112 2.382.164
Espectral - 768.888 1.536.936 2.297.834 3.049.666 3.794.980
ND - 715.964 1.332.398 1.831.540 2.152.536 2.355.772
AMD - 752.758 1.073.698 1.594.622 1.774.316 1.980.370
Figura 5.22: Preenchimento da matriz 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2
ILU(0) ILU(1) ILU(2) ILU(3) ILU(4) ILU(5)
S/ reord. 421 132 72 43 20 27
Sloan 125 93 51 39 32 26
RCM 130 95 55 40 30 26
Espectral 196 101 62 44 32 28
ND 365 146 102 65 52 46
AMD 387 140 112 61 56 44
Figura 5.23: Iterações da matriz 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2
Capítulo 5. Testes Computacionais 48
ILU(0) ILU(1) ILU(2) ILU(3) ILU(4) ILU(5)
S/ reord. 16,56 31,32 82,33 302,63 978,78 2734,07
Sloan 9,11 19,25 18,50 19,25 20,37 21,94
RCM 8,01 ∙ 18,20 ∙ 17,46 ∙ 18,06 ∙ 18,99 ∙ 20,76 ∙
Espectral 9,18 18,26 18,54 20,43 23,24 27,55
ND 15,55 20,59 21,37 22,14 23,82 25,46
AMD 15,64 19,67 19,70 20,16 21,24 22,68
Figura 5.24: Tempo de CPU da matriz 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2
Na Tabela 5.7 podemos perceber que todos os algoritmos reduziram bastante as
métricas analisadas. O Sloan se destaca, apesar de ter tido o maior tempo computacional.
Em todos os níveis de preenchimento há um melhora significativa na redução do
preenchimento para todos os algoritmos na Figura 5.22. O Sloan e RCM mantiveram o
preenchimento similar, liderando até o nível 3 de preenchimento. A partir desse nível o
AMD passa a ter a melhor redução. Já na Figura 5.23 podemos reparar que nem sempre
as iterações das matrizes reordenadas foi menor do que da matriz sem reordenamentos.
Os tempos de CPU finais na Figura 5.24 apresentaram um excelente comportamento.
Além de ter havido melhora em todos os níveis de preenchimento, os tempos são bastante
equiparáveis entre os algoritmos de reordenamento. Destaque para os níveis maiores, que
reduziram muito o tempo de CPU e possuem pouca discrepância dos tempos do nível
anterior. Ainda assim, o menor tempo ocorreu em ILU(0) com o RCM.
49 5.7. Matriz 𝑏𝑜𝑛𝑒𝑆01
5.7 Matriz 𝑏𝑜𝑛𝑒𝑆01
(a) Original (b) SLOAN (c) RCM
(d) ESPECTRAL (e) ND (f) AMD
Figura 5.25: Esparsidades da matriz 𝑏𝑜𝑛𝑒𝑆01
env(.) lb(.) Tempo de CPU
Original 331.330.356 3.722 -
Sloan 317.794.617 49.757 102,027
RCM 391.130.964 7.604 41,944
Espectral 308.790.384 13.622 3,932
ND - - 0,985
AMD - - 0,067
Tabela 5.8: Medições da matriz 𝑏𝑜𝑛𝑒𝑆01
Capítulo 5. Testes Computacionais 50
ILU(0) ILU(1) ILU(2) ILU(3) ILU(4) ILU(5)
S/ reord. - 6.467.202 13.943.844 22.348.404 31.932.252 42.936.012
Sloan - 4.622.274 10.519.650 17.157.564 24.662.070 33.182.568
RCM - 4.586.148 10.233.648 16.854.336 24.583.032 33.636.384
Espectral - 5.967.684 13.586.562 21.973.428 31.306.446 41.928.624
ND - 6.116.868 12.221.472 17.629.524 22.429.008 26.729.430
AMD - 5.932.548 11.569.346 17.072.138 22.464.376 27.746.400
Figura 5.26: Preenchimento da matriz 𝑏𝑜𝑛𝑒𝑆01
ILU(0) ILU(1) ILU(2) ILU(3) ILU(4) ILU(5)
S/ reord. 1992 558 206 142 109 89
Sloan 629 267 187 137 107 86
RCM 739 264 180 133 104 86
Espectral 705 252 170 125 100 84
ND 3881 551 228 171 132 107
AMD 2342 322 213 158 124 100
Figura 5.27: Iterações da matriz 𝑏𝑜𝑛𝑒𝑆01
51 5.7. Matriz 𝑏𝑜𝑛𝑒𝑆01
ILU(0) ILU(1) ILU(2) ILU(3) ILU(4) ILU(5)
S/ reord. 850,93 372,92 439,06 786,47 1641,07 3300,51
Sloan 364,73 307,84 417,29 605,25 1047,95 1884,14
RCM 335,38 242,10 336,44 ∙ 513,85 ∙ 958,76 ∙ 1835,23 ∙
Espectral 303,54 ∙ 221,28 ∙ 405,99 753,66 1551,48 3082,77
ND 1582,48 ∙ 392,03 ∙ 538,84 ∙ 1001,08 ∙ 1570,17 2651,05
AMD 981,76 ∙ 307,08 492,61 ∙ 983,66 ∙ 1761,45 ∙ 3287,21
Figura 5.28: Tempo de CPU da matriz 𝑏𝑜𝑛𝑒𝑆01
Os dados da Tabela 5.8 mostram que o Espectral foi o algoritmo que mais reduziu o
envelope. Já a largura de banda aumentou em todos os algoritmos, com destaque para o
Sloan que além de ter tido a pior largura de banda, teve pior desempenho computacional.
Já na Figura 5.26 podemos perceber que o Sloan e RCM tiveram o menor preenchi-
mento em ILU(1), ILU(2) e ILU(3), perdendo para o ND e AMD nos níveis seguintes.
Apesar disso, a redução do preenchimento no ND e AMD não foi capaz de melhorar o
número de iterações nem o tempo computacional, como podemos ver nas Figuras 5.27 e
5.28. Mais do que isso, os tempos finais do ND e AMD não foram, na maioria das vezes,
ao menos vantajosos. Diferente dos algoritmos Sloan, RCM e Espectral que, apesar de
pouco, reduziram os tempos de CPU em todos os níveis de preenchimento. O menor
tempo ocorreu com o algoritmo Espectral em ILU(1).
Capítulo 6
Conclusões
Para cada algoritmo estudado, a Tabela 6.1 mostra suas principais características, com
base no conjunto de matrizes testadas (que foram além do conjunto apresentado), e em
toda compreensão que tive deste trabalho.
tttttttttttttttttttttt
Preenchimento
Iterações
Tem
podeCPU
Implementação
Condicionamento
Sloan G# G# s n n
RCM s n
Espectral G# s s n
ND s s s n n n
AMD G# G# G# s s s n n n
Tabela 6.1: Análise final
A primeira coluna da tabela refere-se a quantidade de preenchimento gerado por
cada algoritmo. Quanto mais , maior é o preenchimento gerado pelo algoritmo. Como
pudemos perceber nos testes, os algoritmos ND e AMD foram os que, no geral, mais
reduziram o preenchimento, enquanto que o Espectral foi o que causou menos reduções.
Já o Sloan e o RCM tiveram reduções bem próximas.
Capítulo 6. Conclusões 54
O número de iterações, apresentado na segunda coluna da tabela, também deve ser
lido da mesma forma que o preenchimento. Quanto mais , maior o número necessário de
iterações para a matriz reordenada convergir pelo método GMRES. Podemos notar que
os algoritmos que tiveram pouco preenchimento, como ND e AMD, tiveram que realizar
mais iterações para convergir. Da mesma forma, o elevado preenchimento causado pelo
Espectral fez diminuir a quantidade de iterações necessárias.
Quanto ao tempo de CPU final na terceira coluna, temos o RCM como o mais van-
tajoso, seguido pelo Sloan e Espectral. Analisando alguns dos testes, podemos reparar
na tendência do algoritmo RCM de reduzir mais a largura de banda do que o envelope.
Já o Sloan e o Espectral tendem a reduzir mais o envelope ao invés da largura de banda.
Podemos conjecturar, então, que a redução da largura de banda tem um impacto mais
positivo no tempo final de CPU do que a redução do envelope. Tal análise não inclui os
algoritmos ND e AMD que não reordenam segundo essas métricas.
A quarta coluna mede o quão fácil é a implementação de cada algoritmo. Quanto me-
nos s, mais fácil é a implementação. Portanto, o RCM foi categorizado como o mais fácil
de se implementar, seguido pelo Sloan. Esses dois algoritmos foram os únicos totalmente
implementados por mim, e, na minha opinião a única dificuldade que possa surgir ao de
implementá-los é na construção da estrutura de nível para encontrar os vértices pseudo-
periféricos. Para os algoritmos Espectral, ND e AMD foram utilizadas bibliotecas, cujos
códigos foram adaptados para minhas estruturas. Esses algoritmos foram classificados
como médio, difícil e difícil, respectivamente. Para o Espectral, não é simples construir
um algoritmo para encontrar o autovetor associado ao segundo menor autovalor. O ND
recai na necessidade de construir um método de bisseção que divide o grafo em duas par-
tições, além de precisar encontrar o conjunto de vértices separadores. Já o AMD precisa
construir um Grafo de Eliminação a cada passo, tornando sua implementação não trivial.
Por fim, a quinta coluna refere-se ao condicionamento das novas matrizes geradas
pelos reordenamentos. Muitos n significam que o reordenamento, no geral, piorou o
55
condicionamento da matriz. Logo, baseado nos testes com as matrizes 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾
e 𝐵𝑎𝑢𝑚𝑎𝑛𝑛, podemos reparar que o RCM, o Sloan e o Espectral tendem a melhorar o
condicionamento, enquanto que o com o ND e AMD isso não ocorreu.
Analisando globalmente a Tabela 6.1, os algoritmos com menos itens, são considerados
os melhores. Logo, nessa análise, o RCM foi o que apresentou melhores resultados,
seguido do Sloan e Espectral. Apesar disso, o ND e AMD tiveram casos muito mais
vantajosos para níveis de preenchimento grandes.
Um fato interessante é que, as matrizes com os elementos não nulos muito dispersos,
longe da diagonal principal, tiveram todos os tempos de CPU vantajosos para todos os
algoritmos. Podemos perceber isso analisando as figuras da configuração da esparsidade
das matrizes 𝑟𝑎𝑖𝑙_5177, 𝑡ℎ𝑒𝑟𝑚𝑜𝑚𝑒𝑐ℎ_𝑇𝐾 e 𝐷𝑢𝑏𝑐𝑜𝑣𝑎2. A qualidade de redução do
tempo já não foi tão boa para matrizes que já possuem os elementos não nulos muito
próximos da diagonal principal.
Como trabalhos futuros, destaco o estudo do comportamento dos algoritmos em um
conjunto de matrizes com elementos não nulos muito dispersos da diagonal. Esse conjunto
de matrizes poderia influenciar no resultado final comparativo da Tabela 6.1. Além disso,
analisar a escolha dos parâmetros 𝑊1 e 𝑊2 do algoritmo Sloan, já que esse algoritmo
foi o que mais se aproximou, em qualidade, do RCM. Talvez com uma melhor escolha
de parâmetros, poderíamos obter resultados mais satisfatórios. Seria importante estudar
também implementações de alguns desses algoritmos em paralelo. Um estudo atual de
Manguoglu et al. (2010) sugere uma implementação em paralelo baseada no algoritmo
Espectral titulada Weighted Espectral Ordering.
Referências Bibliográficas
Alan George, Joseph Liu, E. N. (1994). Computer Solution of Sparse Linear Systems.
Barnard, S. T., Pothen, A., and Simon, H. D. (1993). A spectral algorithm for envelope
reduction of sparse matrices. In Proceedings of the 1993 ACM/IEEE conference on
Supercomputing, Supercomputing ’93, pages 493–502, New York, NY, USA. ACM.
Benzi, M., Szyld, D. B., and Duin, A. V. (1999). Orderings for incomplete factorization
preconditioning of nonsymmetric problems. SIAM J. SCI. COMPUT, 20(5):1652–1670.
Boldrini, J. L., Costa, S. I. R., Figueiredo, V. L., and Wetzler, H. G. (1986). Algebra
Linear. 3ª edition.
Camata, J., Rossa, A., Valli, A., Catabriga, L., Valli, A. M. P., Carey, G., and Coutinho,
A. (2012). Reordering and incomplete preconditioning in serial and parallel adaptive
mesh refinement and coarsening flow solutions. International Journal for Numerical
Methods in Fluids, 69:802–823.
Carmo, F. C. (2005). Análise da influência de algoritmos de reordenação de matrizes
esparsas no desempenho do método CCCG(n). Master’s thesis, Universidade Federal
de Minas Gerais.
Cuthill, E. and McKee, J. (1969). Reducing the bandwidth of sparse symmetric matrices.
In Proceedings of the 1969 24th national conference, ACM ’69, pages 157–172, New
York, NY, USA. ACM.
57 Referências Bibliográficas
Davis, T. A., Amestoy, P., Duff, I. S., Iain, and Duff, S. (1994). An approximate minimum
degree ordering algorithm. SIAM Journal on Matrix Analysis and Applications, 17:886–
905.
Delebecque, F. and Steer, S. (2013). Scilab 5.4.1 - open source software for numerical
computation. https://www.scilab.org/.
Everstine, G. C. (1979). A comparasion of three resequencing algorithms for the reduc-
tion of matrix profile and wavefront. Internacional Journal for Numerical Methods in
Engineering, 14:837–853.
Fiedler, M. (1973). Algebraic connectivity of graphs. Czechoslovak Mathematical Journal,
23:298–305.
George, A. (1973). Nested dissection of a regular finite element mesh. SIAM Journal on
Numerical Analysis, 10(2):345–363.
George, A. and Liu, J. W. H. (1979). An implementation of a pseudoperipheral node
finder. ACM Trans. Math. Softw., 5(3):284–295.
George, A. and Liu, J. W. H. (1981). Computer Solution of Large Sparse Positive Definite
Systems. Prentice Hall, Englewood Cliffs, NJ.
George, J. A. (1971). Computer implementation of the finite element method. PhD thesis,
Calif School of Humanities and Sciences Stanford Department of Computer Science,
Stanford, CA, USA. AAI7205916.
Ghidetti, K. R. (2011). O impacto do reordenamento de matrizes esparsas nos métodos
iterativos não estacionários precondicionados. Master’s thesis, Universidade Federal
do Espírito Santo.
Gibbs, N. E., Poole, W. G., and Stockmeyer, P. K. (1976). An algorithm for reducing
the profile and bandwidth of a sparse matrix. SIAM J. Numer. Anal., 13:236–250.
Referências Bibliográficas 58
Gonçalez, T. T. (2005). Algoritmos adaptativos para o método GMRES(m). Master’s
thesis, Universidade Federal do Rio Grande do Sul.
Hendrickson, B. and Leland, R. (1995). A multilevel algorithm for partitioning graphs.
In Proceedings of the 1995 ACM/IEEE conference on Supercomputing (CDROM), Su-
percomputing ’95, New York, NY, USA. ACM.
Hendrickson, B. and Leland, R. (2013). Chaco: Software for partitioning graphs.
http://www.sandia.gov/ bahendr/chaco.html.
Juvan, M. and Mohar, B. (1992). Optimal linear labelings and eigenvalues of graphs.
Discrete Appl. Math., 36(2):153–168.
Karypis, G. (2013). METIS - a software package for partitioning unstructured graphs,
partitioning meshes, and computing fill-reducing orderings of sparse matrices.
Karypis, G. and Kumar, V. (1998). A fast and high quality multilevel scheme for parti-
tioning irregular graphs. SIAM J. Sci. Comput., 20(1):359–392.
Liu, J. W. H. (1985). Modification of the minimum-degree algorithm by multiple elimi-
nation. ACM Trans. Math. Softw., 11(2):141–153.
Manguoglu, M., Koyutürk, M., Sameh, A. H., and Grama, A. (2010). Weighted matrix
ordering and parallel banded preconditioners for iterative linear system solvers. SIAM
J. Sci. Comput., 32(3):1201–1216.
Saad, Y. (2003). Iterative Methods for Sparse Linear Systems. Society for Industrial and
Applied Mathematics, Philadelphia, PA, USA, 2nd edition.
Saad, Y. and Schultz, M. H. (1986). GMRES: a generalized minimal residual algorithm
for solving nonsymmetric linear systems. SIAM J. Sci. Stat. Comput., 7(3):856–869.
Sloan, S. W. (1986). An algorithm for profile and wavefront reduction of sparse matrices.
Internacional Journal for Numerical Methods in Engineering, 23:239–251.
59 Referências Bibliográficas
Sloan, S. W. (1989). A fortran program for profile and wavefront reduction. An Algorithm
for Profile and Wavefront Reduction of Sparse Matrices, 28:2651–2679.
Stoer, J. and Bulirsch, R. (2002). Introduction to Numerical Analysis. Springer, New
York, 3 edition.
Timothy A. Davis, Yifan Hu, A. R. (2013a). The University of Florida Sparse Matrix
Collection. http://www.cise.ufl.edu/research/sparse/matrices/.
Timothy A. Davis, Patrick R. Amestoy, I. S. D. (2013b). AMD: approximate minimum
degree ordering. http://www.cise.ufl.edu/research/sparse/amd/.
Apêndice A
Implementações CSR
Algoritmo 12: Elemento 𝑎𝑖𝑗 → 𝑎𝑖𝑗 = (𝐴,𝑖,𝑗)
1 para 𝑘 = 𝐼𝐴(𝑖) até 𝐼𝐴(𝑖+ 1)− 1 faça
2 se 𝐽𝐴(𝑘) = 𝑗 então3 𝑎𝑖𝑗 = 𝐴𝐴(𝑘)4 fim
5 fim
6 𝑎𝑖𝑗 = 0
Algoritmo 13: Produto matriz × vetor → 𝑏 = (𝐴,𝑥)
1 para 𝑖 = 1 até 𝑛 faça
2 𝑠𝑜𝑚𝑎 = 03 para 𝑗 = 𝐼𝐴(𝑖) até 𝐼𝐴(𝑖+ 1)− 1 faça
4 𝑠𝑜𝑚𝑎 = 𝑠𝑜𝑚𝑎+𝐴𝐴(𝑗) * 𝑥(𝐽𝐴(𝑗))5 fim
6 𝑏(𝑖) = 𝑠𝑜𝑚𝑎
7 fim
61
Algoritmo 14: Substituição Sucessiva → 𝑥 = (𝐴,𝑏)
1 𝑥(𝑛) = 𝑏(1)/𝑎𝑖𝑗(𝐴,1,1)2 𝑠𝑜𝑚𝑎 = 03 para 𝑖 = 2 até 𝑛 faça
4 𝑠𝑜𝑚𝑎 = 𝑏(𝑖)5 para 𝑗 = 𝐼𝐴(𝑖) até 𝐼𝐴(𝑖+ 1)− 1 faça
6 se 𝐽𝐴(𝑗) = 𝑖 então7 𝑑𝑖𝑎𝑔𝑜𝑛𝑎𝑙 = 𝐴𝐴(𝑗)8 fim
9 se 𝐽𝐴(𝑗) < 𝑖 então10 𝑠𝑜𝑚𝑎 = 𝑠𝑜𝑚𝑎−𝐴𝐴(𝑗) * 𝑥(𝐽𝐴(𝑗))11 fim
12 fim
13 𝑥(𝑖) = 𝑠𝑜𝑚𝑎/𝑑𝑖𝑎𝑔𝑜𝑛𝑎𝑙
14 fim
Algoritmo 15: Substituição Retroativa → 𝑥 = (𝐴,𝑏)
1 𝑥(𝑛) = 𝑏(𝑛)/𝑎𝑖𝑗(𝐴,𝑛,𝑛)2 𝑠𝑜𝑚𝑎 = 03 para 𝑖 = 𝑛− 1 até 1 faça
4 𝑠𝑜𝑚𝑎 = 𝑏(𝑖)5 para 𝑗 = 𝐼𝐴(𝑖) até 𝐼𝐴(𝑖+ 1)− 1 faça
6 se 𝐽𝐴(𝑗) = 𝑖 então7 𝑑𝑖𝑎𝑔𝑜𝑛𝑎𝑙 = 𝐴𝐴(𝑗)8 fim
9 se 𝐽𝐴(𝑗) > 𝑖 então10 𝑠𝑜𝑚𝑎 = 𝑠𝑜𝑚𝑎−𝐴𝐴(𝑗) * 𝑥(𝐽𝐴(𝑗))11 fim
12 fim
13 𝑥(𝑖) = 𝑠𝑜𝑚𝑎/𝑑𝑖𝑎𝑔𝑜𝑛𝑎𝑙
14 fim
Algoritmo 16: ILU(0) →𝑀 = (𝐴)
1 𝑀 = 𝐴2 para 𝑖 = 2 até 𝑛 faça
3 para 𝑘 = 𝐼𝐴𝐴(𝑖) até 𝑖 ̸= 𝐽𝐴𝐴(𝑘) faça4 𝐴𝐴𝑀 (𝑘) = 𝐴𝐴𝑀 (𝑘)/𝑎𝑖𝑗(𝑀,𝐽𝐴𝑀 (𝑘),𝐽𝐴𝑀 (𝑘))5 para 𝑗 = 𝑘 + 1 até 𝐼𝐴𝐴(𝑖+ 1)− 1 faça
6 𝐴𝐴𝑀 (𝑗) = 𝐴𝐴𝑀 (𝑗)− (𝐴𝐴𝑀 (𝑘) * 𝑎𝑖𝑗(𝑀,𝐽𝐴𝑀 (𝑘),𝐽𝐴𝑀 (𝑗))7 fim
8 fim
9 fim
Apêndice A. Implementações CSR 62
Algoritmo 17: ILU(p) →𝑀 = (𝐴,𝑝)
1 para 𝑖𝑖 = 1 até 𝑛 faça2 𝐿𝐸𝑉 𝑝 → 𝑛𝑒𝑥𝑡 = 𝑁𝑈𝐿𝐿3 𝐿𝐸𝑉 𝑝 → 𝑛 = 04 para 𝑖 = 1 até 𝑛 faça5 𝐿𝐸𝑉 𝑖𝑖(𝑖) = 06 fim7 para 𝑖 = 𝐼𝐴𝐴(𝑖𝑖) até 𝐼𝐴𝐴(𝑖𝑖+ 1)− 1 faça8 𝑤(𝐽𝐴𝐴(𝑖)) = 𝐴𝐴𝐴(𝑖)9 𝐿𝐸𝑉 𝑖𝑖(𝐽𝐴𝐴(𝑖)) = 1
10 𝐿𝐸𝑉 𝑝 = 𝑖𝑛𝑠𝑒𝑟𝑒(𝐿𝐸𝑉 𝑝,𝐽𝐴𝐴(𝑖))
11 fim12 𝑗𝑗 = 013 𝐿𝐸𝑉 𝑝_𝑎𝑢𝑥 = 𝐿𝐸𝑉 𝑝_𝑎𝑢𝑥 → 𝑛𝑒𝑥𝑡14 enquanto 𝑗𝑗 < 𝑖𝑖 faça15 𝑗𝑗 = 𝑎𝑢𝑥 → 𝐽𝐴16 se 𝑗𝑗 ≥ 𝑖𝑖 então17 𝑏𝑟𝑒𝑎𝑘18 fim19 𝑗𝑙𝑒𝑣 = 𝐿𝐸𝑉 𝑖𝑖(𝑗𝑗)20 se 𝑗𝑙𝑒𝑣 ≤ 𝑝+ 1 então21 𝑚𝑢𝑙𝑡𝑖𝑝𝑙𝑖𝑐𝑎𝑑𝑜𝑟 = 𝑤(𝑗𝑗)/𝑎𝑖𝑗(𝑀,𝑗𝑗,𝑗𝑗)22 para 𝑘 = 𝐼𝐴𝑀 (𝑗𝑗) até 𝐼𝐴𝑀 (𝑗𝑗 + 1)− 1 faça23 se 𝐽𝐴𝑀 (𝑘) ≥ 𝑗𝑗 então24 𝑗 = 𝐽𝐴𝑀 (𝑘)25 𝑡𝑒𝑚𝑝 = 𝑎𝑖𝑗(𝐿𝐸𝑉 𝑠,𝑗𝑗,𝑗) + 𝑗𝑙𝑒𝑣26 se 𝐿𝐸𝑉 𝑖𝑖(𝑗) = 0 então27 se 𝑡𝑒𝑚𝑝 ≤ 𝑝+ 1 então28 𝑤(𝑗) = −𝑚𝑢𝑙𝑡𝑖𝑝𝑙𝑖𝑐𝑎𝑑𝑜𝑟 *𝐴𝐴𝑀 (𝑘)29 𝐿𝐸𝑉 𝑝 = 𝑖𝑛𝑠𝑒𝑟𝑒(𝐿𝐸𝑉 𝑝,𝑗)30 𝐿𝐸𝑉 𝑖𝑖(𝑗) = 𝑡𝑒𝑚𝑝
31 fim
32 senão33 𝑤(𝑗) = 𝑤(𝑗)−𝑚𝑢𝑙𝑡𝑖𝑝𝑙𝑖𝑐𝑎𝑑𝑜𝑟 *𝐴𝐴𝑀 (𝑘)34 𝐿𝐸𝑉 𝑖𝑖(𝑗) = 𝑚𝑖𝑛(𝐿𝐸𝑉 𝑖𝑖(𝑗), 𝑡𝑒𝑚𝑝)
35 fim
36 fim
37 fim38 𝑤(𝑗𝑗) = 𝑚𝑢𝑙𝑡𝑖𝑝𝑙𝑖𝑐𝑎𝑑𝑜𝑟;
39 fim40 𝐿𝐸𝑉 𝑝_𝑎𝑢𝑥 = 𝐿𝐸𝑉 𝑝_𝑎𝑢𝑥 → 𝑛𝑒𝑥𝑡
41 fim42 para 𝐿𝐸𝑉 𝑝_𝑎𝑢𝑥 = 𝐿𝐸𝑉 𝑝 → 𝑛𝑒𝑥𝑡 até 𝐿𝐸𝑉 𝑝_𝑎𝑢𝑥 ̸= 𝑁𝑈𝐿𝐿 faça43 𝐴𝐴𝑀 (𝑚_𝐽𝐴) = 𝑤(𝑎𝑢𝑥 → 𝐽𝐴)44 𝐽𝐴𝑀 (𝑚_𝐽𝐴) = 𝑎𝑢𝑥 → 𝐽𝐴45 𝑚_𝐼𝐴 = 𝑚_𝐼𝐴+ 146 𝑚_𝐽𝐴 = 𝑚_𝐽𝐴+ 147 se 𝑎𝑢𝑥 → 𝐽𝐴 ≥ 𝑖𝑖 então48 𝐴𝐴𝐿𝐸𝑉 𝑠(𝑙𝑒𝑣_𝐽𝐴) = 𝐿𝐸𝑉 𝑖𝑖(𝑎𝑢𝑥 → 𝐽𝐴)49 𝐽𝐴𝐿𝐸𝑉 𝑠(𝑙𝑒𝑣_𝐽𝐴) = 𝑎𝑢𝑥 → 𝐽𝐴50 𝑙𝑒𝑣_𝐼𝐴 = 𝑙𝑒𝑣_𝐼𝐴+ 151 𝑙𝑒𝑣_𝐽𝐴 = 𝑙𝑒𝑣_𝐽𝐴+ 1
52 fim
53 fim54 𝐼𝐴𝑀 (𝑖𝑖+ 1) = 𝑚_𝐼𝐴55 𝐼𝐴𝐿𝐸𝑉 𝑠(𝑖𝑖+ 1) = 𝑙𝑒𝑣_𝐼𝐴56 𝑛𝑛𝑧𝑀 = 𝑚_𝐼𝐴− 1
57 fim
63
A implementação do Algoritmo 17 não foi tão simples. O código é extenso e difícil
de relacionar com o Algoritmo 4 que foi descrito na seção 2.2.1 utilizando a matriz no
formato denso. Esse algoritmo foi baseado no código 𝑠𝑝𝑖𝑙𝑢_𝑖𝑙𝑢𝑘𝑀 implementado para
o software científico para computação numérica Scilab (Delebecque and Steer, 2013). O
pacote contendo esse código pode ser encontrado em http://forge.scilab.org/index.
php/p/spilu/source/tree/HEAD/macros. Com relação ao Algoritmo 17, abaixo estão
informações das variáveis utilizadas:
� 𝑤 e 𝐿𝐸𝑉 𝑖𝑖 são vetores esparsos, ou seja, vetores de tamanho 𝑛 onde um futuro
elemento que será criado pelo preenchimento na coluna 𝑗 será inserido na posição
𝑗 nesses vetores. Dessa forma, sabendo a posição 𝑗 (guardada em 𝐿𝐸𝑉 𝑝 descrito
abaixo), o acesso a esse elemento é direto. Ao final de cada passo do algoritmo
(linha 42), 𝑤 terá os valores da linha 𝑖 de 𝑀 . Da mesma forma, 𝐿𝐸𝑉 𝑖𝑖 terá o nível
de preenchimento da linha 𝑖 de 𝑀 .
� 𝐿𝐸𝑉 𝑝 é uma lista encadeada com cabeça e inserção ordenada. Essa estrutura
guarda os valores de colunas (𝐽𝐴), e é usada para acessar o vetor 𝑤 e 𝐿𝐸𝑉 𝑖𝑖.
Guardando os valores de coluna que há preenchimento, podemos acessar 𝑤 e 𝐿𝐸𝑉 𝑖𝑖
diretamente. É preciso que a inserção nessa lista seja feita ordenadamente, para
simular o armazenamento CSR. Essa abordagem foi utilizada, pois o armazena-
mento CSR foi implementado com vetores. Logo, quando há preenchimento fica
difícil inserir dados no meio do vetor.
� 𝐿𝐸𝑉 𝑝_𝑎𝑢𝑥 é simplesmente uma lista auxiliar para percorrer 𝐿𝐸𝑉_𝑝.
� 𝑀 e 𝐿𝐸𝑉 𝑠 são matrizes esparsas. 𝑀 guarda a matriz precondicionada e 𝐿𝐸𝑉 𝑠 os
níveis de preenchimento de cada elemento.
� 𝑚_𝐼𝐴, 𝑚_𝐽𝐴, 𝑙𝑒𝑣_𝐼𝐴, 𝑙𝑒𝑣_𝐽𝐴 são variáveis inteiras, iniciadas com 1.
Top Related