Você está na página 1de 50

INSTITUTO TECNOLÓGICO DA AERONAÚTICA

PROF. JOÃO L. F. AZEVEDO

CC-297
Elementos de Mecânica dos Fluidos
Computacional
Projeto No.1

ALEXANDRE FELIPE MEDINA CORRÊA

São José dos Campos – SP – Brasil


Lista de ilustrações

Figura 1 – Esquematização da malha computacional bidimensional e numeração


dos nós de cada elemento de acordo com as linhas e colunas de nossa
matriz. Adaptado de [1]. . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Figura 2 – Esquematização do processo de cálculo iterativo para cada ponto, ou
célula, da malha computacional para os métodos PGS e SOR. Adaptado
de [1]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Figura 3 – Breve exemplo de como seria a avaliação ponto a ponto para métodos
LGS e SLOR, e como isso levaria ao problema de implementação por
não contemplar o ponto ( )i,j+1 . Adaptado de [1]. . . . . . . . . . . . 8
Figura 4 – Breve esquema para resolução do algorítmo de Thomas. . . . . . . . . 9
Figura 5 – Representação do aerofólio na malha computacional. . . . . . . . . . . 10
Figura 6 – Parâmetros para configuração de malha computacional. . . . . . . . . . 13
Figura 7 – Malha computacional utilizada para os cálculos, e disposição do aerofólio
virtual da corda do aerofólio em seu interior. . . . . . . . . . . . . . . . 14
Figura 8 – Diagrama de blocos para solução numérica do escoamento potencial
através de métodos de relaxação. . . . . . . . . . . . . . . . . . . . . . 15
Figura 9 – Histórico de convergência para ε < 10−8 . . . . . . . . . . . . . . . . . . 16
Figura 10 – Mensagens de saída do código ao fim de cada iteração para testes a
ε < 10−8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Figura 11 – Resultados de coeficiente de pressão para os métodos iterativos em
relação à referência, ε < 10−8 . . . . . . . . . . . . . . . . . . . . . . . . 18
Figura 12 – Histórico do erro errCP para número máximo de iterações igual a 12000. 19
Figura 13 – Mensagens de saída do código ao fim de cada iteração para número
máximo de iterações fixo e igual a 12000. . . . . . . . . . . . . . . . . . 19
Figura 14 – Mensagens de saída do código ao fim de cada iteração para testes a
ε < 10−8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Figura 15 – Histórico de convergência para ε < 10−8 . . . . . . . . . . . . . . . . . . 20
Figura 16 – Resultados de coeficiente de pressão para os métodos iterativos (método
de pequenas perturbações) em relação à referência (potencial completo),
ε < 10−8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Figura 17 – Histórico de convergência para o resíduo Lφ e histórico do erro errCP
para critério ε < 10−8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Figura 18 – Resultados de coeficiente de pressão para os métodos iterativos (método
de pequenas perturbações) em relação à referência (potencial completo),
ε < 10−8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Figura 19 – Campo de velocidade u para escoamento potencial sobre aerofólio bi-
convexo utilizando método SLOR e espessura de aerofólio 5%, ε < 10−8 . 24
Figura 20 – Campo de velocidade v para escoamento potencial sobre aerofólio bi-
convexo utilizando método SLOR e espessura de aerofólio 5%, ε < 10−8 . 24
Figura 21 – Campo de coeficiente de pressão CP para escoamento potencial sobre
aerofólio biconvexo utilizando método SLOR e espessura de aerofólio
5%, ε < 10−8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Figura 22 – Campo de velocidade u para escoamento potencial sobre aerofólio bi-
convexo utilizando método SLOR e espessura de aerofólio 10%, ε < 10−8 . 25
Figura 23 – Campo de velocidade v para escoamento potencial sobre aerofólio bi-
convexo utilizando método SLOR e espessura de aerofólio 10%, ε < 10−8 . 26
Figura 24 – Campo de coeficiente de pressão CP para escoamento potencial sobre
aerofólio biconvexo utilizando método SLOR e espessura de aerofólio
10%, ε < 10−8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Lista de tabelas

Tabela 1 – Malhas utilizadas para estudo. . . . . . . . . . . . . . . . . . . . . . . 22


Sumário

1 CONTEXTUALIZAÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . 1

2 METODOLOGIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.1 Modelagem Físico-Matemática . . . . . . . . . . . . . . . . . . . . . . 2
2.1.1 Método de Jacobi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.2 Métodos de Gauss-Seidel e SOR . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.3 Métodos line-Gauss-Seidel e SLOR . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Condições de Contorno e Condições Iniciais . . . . . . . . . . . . . . 9
2.2.1 Cálculo da Condição de Contorno Implícita . . . . . . . . . . . . . . . . . 11
2.3 Malha Computacional e Diagrama de Blocos . . . . . . . . . . . . . 13

3 RESULTADOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.1 Caso I: Espessura 5% . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2 Caso II: Espessura 10% . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.3 Caso III: Independência de Malha . . . . . . . . . . . . . . . . . . . 21
3.4 Análise do Escoamento . . . . . . . . . . . . . . . . . . . . . . . . . . 24

4 CONCLUSÕES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

REFERÊNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

APÊNDICES 29

APÊNDICE A – CÓDIGO COMPUTACIONAL . . . . . . . . . . . 30


1

1 Contextualização

Um dos primeiros passos para melhor entender a mecânica dos fluidos computacional é
a confecção de um código introdutório, que aborde o problema de maneira simples, mas
forneça a base para a solução futura de problemas mais complexos. Assim, o projeto número
1 parte da equação de Laplace, ou seja, tratamos aqui um escoamento potencial, irrotacional,
incompressível e estacionário. As equações de Laplace, discutidas em breve, serão resolvidas
para um aerofólio biconvexo e sem sustentação, ou seja, o mesmo encontra-se alinhado ao
escoamento com ângulo de ataque nulo.
O código construído neste projeto foi feito utilizando o software MATLAB, que
utiliza M-files. Apesar da construção em M-files, todas as rotinas utilizadas no programa
foram construídas pelo autor, visando não prejudicar o aprendizado quanto à necessidade
de construção de rotinas de solução de sistemas matriciais. Assim, o código foi construído
de forma a ser independente de funções pré-estabelecidas.
Neste documento são discutidos o modelo fisico-matemático bem como a implemen-
tação de condições de contorno para a solução do problema. A convergência de diferentes
métodos iterativos é avaliada caso a caso e um breve estudo do escoamento é realizado ao
final deste documento. Todos as rotinas criadas na construção do código computacional
estão anexas a este documento.
2

2 Metodologia

Esse capítulo tem como objetivo realizar uma breve descrição do modelamento do pro-
blema. Primeiramente partimos da análise fisico-matemática do problema. Em seguida
são apresentados os métodos iterativos utilizados. As condições iniciais consideradas para
o cálculo, bem como as condições de contorno aplicáveis são apresentadas e por fim o
algorítmo para construção da malha computacional.

2.1 Modelagem Físico-Matemática


Como descrito no capítulo 1, partimos primeiramente da equação de Laplace, que
nos descreve um escoamento potencial, incompressível e em estado estacionário. Assim,
como veremos adiante, precisamos nos preocupar apenas com a discretização espacial e
método iterativo, já que temos um escoamento em regime permanente. Assim, a equação
de Laplace é dada pela equação 2.1:

φxx + φyy = 0 (2.1)

Que pode ser reescrita da forma:

∂ 2φ ∂ 2φ
+ =0 (2.2)
∂x2 ∂y 2
E considerando que aqui temos um potencial de velocidade, as velocidades nas
direções x e y são dadas, respectivamente, pela equação 2.3.

∂φ ∂φ
u= ; v= (2.3)
∂x ∂y
Aqui resolveremos a equação diferencial parcial dada pela equação 2.2 utilizando
métodos de relaxação, ou seja, determinamos sua solução estacionária através de um
método iterativo. Há de se lembrar que a equação 2.2 é modificada, ou seja, após seu
tratamento ela não mais representa a física do problema, porém a solução em estado
estacionário da equação modificada (equação essa que passa a ser tratada em regime
transiente) é a mesma que deve ser obtida para a equação original, esta originalmente em
regime estacionário.
Nesse projeto discretizamos nosso problema utilizando a forma padrão de correção,
ou forma delta. Como fora apresentado no handout deste projeto, a forma delta para a
Capítulo 2. Metodologia 3

equação de Laplace pode ser escrita como apresentado na equação 2.4.

n
N · Ci,j + Lφni,j = 0 (2.4)

Como vemos na correção delta, cada termo depende de índices i ej, devido ao
nosso caso ser bidimensional. É importante ressaltar que nosso cálculo é feito num domínio
computacional, discretizado em elementos numa malha computacional. Dessa forma, a
equação 2.4 é resolvida para cada nó desses elementos. Utilizamos uma malha cartesiana
bidimensional no nosso código, de modo que os nós do interior de seus elementos podem ser
enumerados sequencialmente através de suas linhas e colunas. Assim, cada nó é representado
por uma coordenada i, j. A figura 1 representa esquematicamente como funciona nossa
malha, onde são apresentados os nós de cada célula e sua numeração I para colunas e J
para linhas da matriz de cálculo, de modo a representar as direções x e y de nosso domínio
computacional, respectivamente.

Figura 1 – Esquematização da malha computacional bidimensional e numeração dos nós


de cada elemento de acordo com as linhas e colunas de nossa matriz. Adaptado
de [1].

Retornando à correção delta, o primeiro termo da equação 2.4 representa o método


iterativo a ser escolhido; o segundo representa a correção a ser efetuada no potencial
de velocidade; por último temos o operador resíduo, ou seja, a discretização da nossa
n
equação diferencial. Todos avaliados no passo iterativo n. A correção Ci,j pode ser escrita
da seguinte forma:

n
Ci,j = φn+1 n
i,j − φi,j (2.5)
Capítulo 2. Metodologia 4

A discretização do operador resíduo é proveniente do método de diferenças finitas,


de modo que utilizamos a forma para a derivada de segunda ordem. Assim, o operador
resíduo deve ser calculado conforme a equação 2.6.

2 φi+1,j − φi,j φi,j − φi−1,j


 
Lφi,j = · − +
xi+1 − xi−1 xi+1 − xi xi − xi−1
(2.6)
2 φi,j+1 − φi,j φi,j − φi,j−1
 
· −
yj+1 − yj−1 yj+1 − yj yj − yj−1

É importante ressaltar que esse cálculo apenas é feito nos nós do interior da malha,
ou seja, à excessão das fronteiras, onde serão impostas as condições de contorno. Assim,
o operador correção e o operador resíduo são nulos nos contornos de nosso domínio
computacional.
Como comentado, o operador N depende do método iterativo a ser utilizado. Neste
projeto utilizamos os seguintes métodos:

• Jacobi;

• point-Gauss-Seidel (PGS);

• Successive Over-relaxation (SOR);

• line-Gauss-Seidel (LGS);

• Successive Line Over-relaxation (SLOR).

Dos métodos apresentados, os três primeiros são avaliados no ponto, e como veremos,
apenas necessitam de informações previamente calculadas para sua implementação. Já os
dois últimos são calculados linha a linha, e como veremos, irão precisar de um algorítmo
auxiliar para sua resolução.

2.1.1 Método de Jacobi


O método de Jacobi tem um operador simples, o que torna sua implementação
relativamente fácil. Seu operador depende apenas da discretização espacial da malha
utilizada, como mostrado na equação 2.7.

−2 −2
N= 2
+ (2.7)
∆x ∆y 2
Onde as variações espaciais nas direções x e y são dadas por:

xi+1 − xi − 1 yi+1 − yi − 1
∆x = ; ∆y = (2.8)
2 2
Capítulo 2. Metodologia 5

Percebemos portanto que o operador para o método de Jacobi será sempre um


valor negativo. Assim, a forma de correção delta para nosso potencial pode ser escrita
como apresentado na equação 2.9.

n −Lφni,j
Ci,j = = φn+1 n
i,j − φi,j (2.9)
N
Assim, é fácil perceber que para cálcular o valor do potencial no ponto i, j para o
passo n + 1, basta fazer conforme a equação 2.10, pois todos os termos do lado esquerdo da
equação são conhecidos, seja por condições iniciais ou de contorno (discutidas em breve),
seja por informações calculadas no passo anterior, com o operador apresentado na equação
2.7.

Lφni,j
φn+1 n
i,j = φi,j − (2.10)
N

2.1.2 Métodos de Gauss-Seidel e SOR


Agora trataremos de ambos os métodos Gauss-Seidel (ou point-G-S) e SOR simul-
tâneamente. Isso porque podemos escrever o operador iterativo de ambos os métodos de
forma semelhante, de forma que o método PGS torna-se uma particularidade para o SOR.
Assim, o operador N para os métodos pode ser escrito como apresentado na equação 2.11.

Ex−1 − 2/r Ey−1 − 2/r


N= + (2.11)
∆x2 ∆y 2
O termo r apresentado na equação 2.11 trata-se do fator de relaxação do método
SOR. Para o método PGS esse fator é unitário, ou seja, r = 1. Portanto podemos condensar
a tratativa destes métodos num único tópico, e consequentemente, numa única função de
nosso código.
Diferentemente do caso anterior, os métodos SOR fazem uso de operadores deslo-
camento, dados, por exemplo, por:

Ex−1 ( )i,j = ( )i−1,j (2.12)

Assim, nossa correção delta passa a ser escrita de forma diferente da vista na
equação 2.10, passando a ser escrita da forma:

N · φn+1 n n
i,j = N · φi,j − Lφi,j (2.13)
Capítulo 2. Metodologia 6

Se desenvolvermos a equação 2.13, chegamos à equação para resolver nosso potencial


através da correção delta combinada ao método SOR (ou PGS).

 
Lφni,j φn+1 n
i−1,j − φi−1,j φn+1 n
i,j−1 − φi,j−1
φn+1 n
i,j = φi,j + r
   + 
∆x2
 + 
∆y 2
  (2.14)
2 ∆x1 2 + 1
∆y 2
2 1+ ∆y 2
2 1+ ∆x2

Todavia, considerando sua forma para operador correção, tem-se:

 
n Lφni,j n
Ci−1,j n
Ci,j−1
Ci,j = r  1 1
 +  ∆x2
 +  ∆y 2
 (2.15)
2 ∆x2 + ∆y 2
2 1+ ∆y 2
2 1+ ∆x2

Diferentemente do método de Jacobi, que contava apenas com informações do passo


anterior n, os métodos PGS e SOR agora contam com informações atualizadas do novo
passo iterativo n + 1. Assim, utilizando valores atualizados para pontos anteriores nas
direções x e y permitem alcançar convergência utilizando menos passos iterativos. Além
disso, o método SOR conta com o fator de relaxação r, que acelera tal convergência para
r > 0. O funcionamento desses métodos é melhor explicado no esquema apresentado na
figura 2

Figura 2 – Esquematização do processo de cálculo iterativo para cada ponto, ou célula,


da malha computacional para os métodos PGS e SOR. Adaptado de [1].

Quando tratamos do método SOR unidimensional podemos calcular seu fator de


relaxação r ótimo. Para o unidimensional o fator r ótimo pode ser cálculado como:

2
rotm = q (2.16)
1+ 1 − cos( Mπ+1 )2

Porém esse cálculo não abrangeria o caso bidimensional, de modo que uma das
maneiras seria determinar tal fator empiricamente, ou estimá-lo, por exemplo aplicando a
média dos fatores ótimos nas direções x e y.
Capítulo 2. Metodologia 7

2.1.3 Métodos line-Gauss-Seidel e SLOR


De maneira similar ao caso anterior, o método LGS pode ser tratado como uma
particularidade do SLOR, para r = 1. Diferentemente do método anterior, que tratava da
solução das equações ponto a ponto, aqui resolveremos coluna a coluna, devido ao novo
operador utilizado, dado pela equação 2.17.

Ex−1 − 2/r δ yy
N= + (2.17)
∆x2 r
Onde temos agora o operador δ yy , definido por:

" #
2 ( )i,j+1 − ( )i,j ( )i,j − ( )i,j−1
δ yy ( )i,j = −
yj+1 − yj−1 yj+1 − yj yj − yj−1
" # (2.18)
1 ( )i,j+1 − ( )i,j ( )i,j − ( )i,j−1
= −
∆y ∆+ y ∆− y

O desenvolvimento das equações 2.17 e 2.18 leva à uma forma parecida com a
apresentada na equação 2.19 a seguir:

!
1 1 1 2 1 1
φn+1
i,j+1 − + + φn+1
i,j + φn+1 =D (2.19)
+
r∆y∆ y r +
∆y∆ y ∆x 2 −
∆y∆ y r∆y∆ y i,j−1

Onde o termo D depende de Lφni,j , phini,j e seus pontos anteriores e posteriores,


bem como de phin+1
i−1,j , similarmente à casos anteriores. A forma completa da equação 2.19
possui 13 termos para nosso caso bidimensional. A implementação dessa grande sequência
de termos pode ocasionar erros, que podem ser causados por uma simples troca de sinal
ao escrever a equação. Assim, parte-se para uma abordagem mais direta e diferente da
que fora tomada nos métodos de Jacobi e SOR durante sua implementação no código.
Considere que, a partir da equação 2.5 para o operador correção podemos escrever:

φn+1 n n
i,j = Ci,j + φi,j (2.20)

Assim, podemos aplicar o operador dos métodos LGS e SLOR diretamente na


correção delta dada pela equação 2.4, de modo que:

n
N · Ci,j = −Lφni,j (2.21)

Portanto escrevemos:

n n n n
" #
1 n 2 n 1 Ci,j+1 − Ci,j Ci,j − Ci,j−1
2
Ci−1,j − 2
Ci,j + +
− −
= −Lφni,j (2.22)
∆x r∆x r∆y ∆ y ∆ y
Capítulo 2. Metodologia 8

Por fim, chegamos a uma equação da forma:

!
1 n 1 1 2 1 n

Ci,j−1 − +
+ 2
+ −
Ci,j +
r∆y∆ y r ∆y∆ y ∆x ∆y∆ y
(2.23)
1 n 1
+
Ci,j+1 = −Lφni,j − 2
n
Ci−1,j
r∆y∆ y ∆x

Figura 3 – Breve exemplo de como seria a avaliação ponto a ponto para métodos LGS e
SLOR, e como isso levaria ao problema de implementação por não contemplar
o ponto ( )i,j+1 . Adaptado de [1].

A partir da equação 2.23 já percebemos que no passo iterativo n + 1 precisaremos


portanto da informação da linha j + 1, anterior à nossa linha de cálculo j da metodologia
utilizada nos métodos PGS e SOR. Se fossemos considerar essa abordagem, teríamos um
problema por não conhecer o valor j + 1, como exemplificado no esquema apresentado
na figura 3. Ou seja, o método utilizado nos esquemas anteriores não satisfaz nosso novo
esquema. Porém, podemos perceber que a equação 2.23 pode ser reescrita como:

n n n
A · Ci,j−1 − B · Ci,j + C · Ci,j+1 =D (2.24)

A equação 2.24 nos fornece portanto um sistema que forma para cada coluna
da nossa malha um sistema tridiagonal. Esse sistema pode ser resolvido utilizando o
algorítmo de Thomas. Por isso a nomenclatura de nossos métodos: line-G-S e S-Line-O-R.
O algorítmo de Thomas pode ser brevemente apresentado como mostrado na figura 4
Assim, foi apresentado brevemente cada esquema e como resolvê-los considerando
nosso domínio computacional bidimensional. Porém, o método iterativo precisa ser iniciado,
e além disso, nosso aerofólio biconvexo precisa ser considerado durante os cálculos. Para
isso faz-se uso de condições iniciais, que atribuirão um valor inicial para φi,j , e condições de
contorno, que modelarão a presença de nosso aerofólio, bem como as condições aplicadas
nos contornos de nosso domínio, ou seja, suas fronteiras.
Capítulo 2. Metodologia 9

Figura 4 – Breve esquema para resolução do algorítmo de Thomas.

2.2 Condições de Contorno e Condições Iniciais


Como comentado anteriormente, apesar de termos posse das equações para nosso
método iterativo, é necessário apresentar as condições que modelam os contornos de
nosso problema. Iremos resolver o escoamento potencial sobre um aerofólio biconvexo sem
sustentação. O perfil do aerofólio pode ser calculado como apresentado na equação 2.25.

y = 2tx(1 − x) (2.25)
Capítulo 2. Metodologia 10

Na equação 2.25 vemos que a espessura máxima do perfil é dada por t, de modo
que sua espessura local a partir do bordo de fuga respeita a equação dada. É importante
ressaltar que esses valores são adimensionalizados pela corda do aerofólio, que neste caso é
unitária.
A condição de contorno de escoamento tangente na superfície do aerofólio considera
a hipótese de pequenas perturbações, portanto sua velocidade vertical pode ser escrita da
forma:

∂φ dy
v(x, y = 0) = v = (x, 0) = u∞ · , 0≤x≤1 (2.26)
∂y dx
Onde u∞ corresponde à velocidade de escoamento não perturbado. Como já intro-
duzimos essa propriedade, podemos considerar que nas fronteiras laterais e superior de
nosso domínio o escoamento deve se manter na condição de não-perturbado. Portanto,
aplicados a propriedade diretamente em seus nós, considerando uma condição de contorno
de Dirichlet. Como estamos resolvendo a equação de Laplace, as condição de contorno
imposta para escoamento não perturbado nessas fronteiras é dada por:

φ∞ = u∞ · x (2.27)

Resta apenas a definição do contorno aplicado na fronteira inferior de nosso domínio


computacional. Esta, porém, necessita de maior cuidado. Para a resolução deste problema
usaremos uma malha cartesiana, porém a inserção do nosso aerofólio é modelado de uma
forma imposta, de modo que o mesmo encontra-se entre as linhas j = 1 e j = 2 de nossa
malha, como mostrado na figura 5. Dessa maneira a linha j = 2 é modelada apenas para
inserçâo da condição de contorno do aerofólio, como veremos a seguir.

Figura 5 – Representação do aerofólio na malha computacional.

Como observado, a corda do aerofólio está localizada entre duas linhas y =


constante devido à construção de nossa malha computacional. Assim a inserção da con-
Capítulo 2. Metodologia 11

dição de contorno na linha j = 1, que é atualizada a cada passo iterativo, deve ser feita
obedecendo a seguinte equação no início de cada iteração.

!
∂φ

φni,1 = φni,2 − (y2 − y1 ) · (2.28)
∂y y=0 i

De modo que podemos observar que o último tempo do lado direito da equação 2.28
independe do passo iterativo, como visto na equação 2.26 este termo depende apenas de
características geométricas da malha computacional, do aerofólio biconvexo e da condição
de escoamento não perturbado.
A imposição da condição de contorno na fronteira inferior j = 1 parece trivial, e
é, considerando a atualização para o passo iterativo n. A condição de contorno também
não gera nenhum problema quando consideramos, por exemplo, o método de Jacobi, pois
vimos que:

n −Lφni,j
Ci,j = = φn+1 n
i,j − φi,j (2.29)
N
ou seja, o método de Jacobi apenas depende de elementos do passo iterativo n para cálculo
n
de Ci,j , e portanto de φn+1
i,j . Porém, quando avaliamos métodos do tipo SOR, isso já não
passa a ser tão trivial assim. Para métodos PGS e SOR vimos que:

 
n Lφni,j n
Ci−1,j n
Ci,j−1
Ci,j = r  1 1
 +  ∆x2
 +  ∆y 2
 (2.30)
2 ∆x2 + ∆y 2
2 1+ ∆y 2
2 1+ ∆x2

n n n n
ou seja, é fácil perceber que se Ci,j depende de Ci,j−1 , então Ci,2 depende agora de Ci,1 , ou,
n+1 n+1
de outra forma, φi,2 depende de φi,1 . Para nós interiores isso não seria problema, já que
para j > 2 a propriedade φn+1 já foi calculada para j − 1. Porém, como dito anteriormente,
n
Ci,j apenas é cálculada para os nós interiores, e portanto quando nos encontramos em
j = 2 não conhecemos o valor de Ci,1 n
, e consequentemente de φn+1 i,1 . Assim esse valor
n
precisa ser calculado de forma implícita. Porém, como calcular Ci,1 implícitamente? A
resposta para essa pergunta é discutida na sessão a seguir.

2.2.1 Cálculo da Condição de Contorno Implícita


n
Para calcular a condição de contorno implicitamente para o cálculo de Ci,2 devemos
n
partir de sua equação inicial, ou seja, a forma pela qual atualizamos φ a cada iteração.

!
∂φ

φni,1 = φni,2 − (y2 − y1 ) · (2.31)
∂y y=0 i
Capítulo 2. Metodologia 12

Já vimos anteriormente que:

! !
∂φ dy ∂φ

= u∞ · , 0≤x≤1 & = 0, x < 0 ou x > 1 (2.32)
∂y y=0 i
dx ∂y y=0 i

Portanto, é fácil perceber que o valor de φy |y=0 é constante para cada coluna i.
Desta forma podemos reescrever a equação 2.31 da forma:

φni,1 = φni,2 − ctei (2.33)

Da mesma forma que escrevemos para o passo iterativo n, também o podemos


fazer para o passo iterativo n + 1:

φn+1 n+1
i,1 = φi,2 − ctei (2.34)

Se observarmos com atenção, definimos como seria a atualização da condição de


contorno no passo n e n + 1. Tendo posse de ambas os casos, podemos facilmente escrever
da subtração da equação 2.34 pela equação 2.33 que:

φn+1 n n+1 n
i,1 − φi,1 = φi,2 − φi,2 − (ctei − ctei ) (2.35)

Finalmente, concluímos que:

n n
Ci,1 = Ci,2 (2.36)

Tendo posse dessa informação agora sim se torna trivial a imposição da condição
n
de contorno implícita para o cálculo de Ci,2 , e consequentemente φn+1
i,2 para os métodos
PGS e SOR. Nesse caso a equação 2.30 pode ser escrita para j = 2 como:

 
n Lφni,2 n
Ci−1,2 n
Ci,1
Ci,2 = r  1 1
 +  ∆x2
 +  ∆y 2
 (2.37)
2 ∆x2 + ∆y 2
2 1+ ∆y 2
2 1+ ∆x2

Aplicando a equação 2.36 chegamos a:

   
n 1 Lφni,2 n
Ci−1,2
Ci,2 · 1 −  ∆y 2
 = r  1 1
 +  ∆x2
 (2.38)
2 1+ ∆x2
2 ∆x2 + ∆y 2
2 1+ ∆y 2

n
Definimos, portanto, na equação 2.38 o cálculo do operador correção Ci,2 para os
métodos PGS e SOR na linha j = 2 utilizando a condição de contorno em j = 1 implícita.
Assim como os métodos ponto, os métodos linha LGS e SLOR também sofrem com a
Capítulo 2. Metodologia 13

n n
mesma necessidade: é necessário Ci,1 para o cálculo de Ci,2 . Neste caso, para os métodos
LGS e SLOR podemos escrever:

n n n
A · Ci,1 − B · Ci,2 + C · Ci,3 =D (2.39)

Neste caso, aplicando a equação 2.36, reescrevemos a equação 2.39 da forma:

n n
(A − B) · Ci,2 + C · Ci,3 =D (2.40)

n
Através da equação 2.40 conseguimos calcular o operador correção Ci,2 , utilizando o
algorítimo de Thomas, para os métodos PGS e SOR na linha j = 2 utilizando a condição de
contorno em j = 1 implícita. Dessa maneira concluímos a discusão sobre a implementação
das condições de contorno para nosso modelo. Resta agora discutir quanto à inicialização
do modelo.
Para a inicialização do cálculo utilizamos a mesma estratégia para as fronteiras do
nosso domínio: consideramos o escoamento inicialmente como não perturbado, e a partir
disso executamos o cálculo iterativo para encontrar a solução estacionária para a influència
do aerofólio em nosso domínio. Portanto todo o domínio é inicializado tal qual descrito na
equação 2.41.

φ∞ = u∞ · x (2.41)

2.3 Malha Computacional e Diagrama de Blocos


A malha utilizada para os cálculos inicialmente os paramêtros como apresentados
na figura 6. Trata-se de uma malha bidimensional de diferenças finitas cartesiana com
estiramento em ambas as direções.

Figura 6 – Parâmetros para configuração de malha computacional.

As condições de iniciais são aplicadas em todos os nós da malha e as condições de


contorno aplicadas nas fronteiras atualizadas a cada iteração, como discutido na sessão
2.2. Finalmente podemos observar nossa malha computacional inicial como mostrado na
figura 7
Capítulo 2. Metodologia 14

Figura 7 – Malha computacional utilizada para os cálculos, e disposição do aerofólio


virtual da corda do aerofólio em seu interior.

Discutidos o modelamento matemático, condições iniciais e de contorno e também


a malha computacional, em seguida o código pôde ser construído. O mesmo encontra-se
anexo a este documento. A seguir apresentamos um breve diagrama de blocos que sumariza
a estrutura do código computacional.
Para seu funcionamento o código necessita de uma rotina principal que possui os
parâmetros para geração de malha, bem como a seleção do método iterativo a ser utilizado
e seu critério de parada: seja um valor mínimo para considerar o operador resíduo como
suficiente, ou seja, a convergência foi atingida, seja um valor máximo de iterações a serem
realizadas. Esses parâmetros são então inseridos em uma rotina principal, responsável
por fazer a chamada do gerador de malhas, do solucionador e por fim salvar os dados e
gerar os gráficos, se for do interesse do usuário. O solucionador é responsável por atualizar
as condições de contorno e realizar o cálculo iterativo, fazendo a chamada das funções
de cada método iterativo. O solucionador também é responsável por checar o critério de
convergência ou de parada para o cálculo. A figura apresenta o diagrama que condensa
tais informações visualmente.
Capítulo 2. Metodologia 15

Figura 8 – Diagrama de blocos para solução numérica do escoamento potencial através


de métodos de relaxação.
16

3 Resultados

Neste capítulo apresentaremos os resultados para dois casos: para um aerofólio de espessura
5% e outro com espessura 10%. Para o primeiro caso avaliaremos todos os métodos iterativos
descritos neste documento, já para o segundo apenas os métodos linhas serão avaliados.
Nosso objetivo é comparar as capacidades de convegência de cada método, e a proximidade
dos resultados relativos aos dados de referência.

3.1 Caso I: Espessura 5%


Para o primeiro caso, como mencionado, avaliamos todos os métodos iterativos.
Para nossa análise o critério de convergência foi fixado para um valor de Lφi,j inferior a
um resíduo ε < 10−8 , e um número máximo de iterações correspondente a 12000. Para
este caso a velocidade do escoamento não perturbado é unitária. Quando comparamos
todos os métodos podemos ver o poder de convergência de cada um, como apresentado
nas figuras 9 e 10.

Figura 9 – Histórico de convergência para ε < 10−8 .


Capítulo 3. Resultados 17

Figura 10 – Mensagens de saída do código ao fim de cada iteração para testes a ε < 10−8 .

Para esse nível de resíduo o método de Jacobi não converge. O método alcança
um resíduo inferior a ε < 10− 6 após 6000 iterações e imediatamente após começa a
divergir, alcançando o critério de parada para número máximo de iterações com um
resíduo superior a 1. Os métodos PGS e SOR alcançam o resíduo esperado para 3543 e
432 iterações, respectivamente. Neste caso, vemos que o método SOR é quase 10x mais
rápido, considerando o fator de relaxação de 1, 80 aplicado, econtrado empiricamente.
Interessantemente o méotodo SOR diverge para um fator de 1, 90. Com isso vemos o poder
n n n
de convergência ao se calcular Ci,j com valores atualizados de Ci−1,j e Ci,j−1 .
Se comparamos os métodos linha com métodos ponto vemos novamente um decrés-
cimo no número de iterações. O método LGS alcança 2739 iterações, aproximadamente
20% mais rápido que o método PGS. Similarmente, o método SLOR tem seu número
de iterações reduzidas para 185, mais da metade do número alcançado pelo SOR. Esse
aumento da velocidade de convergência está diretamente ligada ao fato de os métodos linha
n n n n
utilizarem não só Ci−1,j e Ci,j−1 mas também Ci,j+1 no cálculo de Ci,j . Ou seja, quanto mais
n
atualizados são os parâmetros utilizados para o cálculo de Ci,j , mais rapidamente se atinge
a convergência. Para o método SLOR o fator de relaxação foi encontrado empiricamente
para um valor de 1, 88. Para os métodos SOR e SLOR fatores de relaxação diferentes dos
encontrados tendem a desacelerar a convergência.
O coeficiente de pressão foi calculado utilizando sua formulação para escoamento
incompressível, como apresentado na equação 3.1. Para o cálculo as velocidades na linha
virtual j = 1, 5(y = 0) foram calculadas como a média das velocidades entre as linhas
j = 2 e j = 1.

u2
CP = 1 − (3.1)
u2∞
Capítulo 3. Resultados 18

Por fim apresentados a distribuição do coeficiente de pressão para os casos. Neste


caso não existe diferenças entre os mesmos, afinal, a solução independe do método iterativo
escolhido, seu cálculo só é acelerado dependendo do método. Assim todos os métodos
alcançaram a mesma solução para o coeficiente de pressão, apresentados na figura 11.
Podemos observar boa concordância entre os casos e o resultado de referência para nosso
estudo, baseado na formulação de potencial completo (lembrando que nossa análise é
baseada no método de pequenas perturbações).

Figura 11 – Resultados de coeficiente de pressão para os métodos iterativos em relação à


referência, ε < 10−8 .

Podemos avaliar também o erro no cálculo do coeficiente de pressão, errCP . Devemos


atentar para o fato de que errCP não é um resíduo, nosso resíduo continua sendo Lφ. Esse
erro trata-se do desvio entre o coeficiente de pressão dos passos iterativos n + 1 e n. Para
atestar que conseguimos atingir o limite no cálculo do CP fixamos o número de iterações
máximo para 12000 como critério de parada, sem fixar um valor mínimo para convergência.
Ao fixarmos tal número máximo como critério de parada é possível avaliar o limite de
cada método. À excessão de método de Jacobi, todos alcançaram resíduo Lφ inferior à
10−11 , e erro errCP inferior a 10−13 , como mostrado nas figuras 12 e 13.
Capítulo 3. Resultados 19

Figura 12 – Histórico do erro errCP para número máximo de iterações igual a 12000.

Figura 13 – Mensagens de saída do código ao fim de cada iteração para número máximo
de iterações fixo e igual a 12000.
Capítulo 3. Resultados 20

3.2 Caso II: Espessura 10%


Para o segundo caso avaliamos apenas os métodos linha. Quanto à convergência
dos métodos temos resultados similares ao caso anterior: o método SLOR possui uma
convergência aproximadamente 15x mais rápida que o método LGS, como mostrado a
seguir. O critério para convergência foi o mesmo do caso anterior.

Figura 14 – Mensagens de saída do código ao fim de cada iteração para testes a ε < 10−8 .

Figura 15 – Histórico de convergência para ε < 10−8 .

Podemos observar, mais uma vez, a importância do fator de relaxação para alcançar
a rápida convergência do cálculo. Assim como no caso anterior, a solução estacionária
não se altera com a mudança do método iterativo, porém ao compararmos o método
de pequenas perturbações com nossa referência a potencial completo percebemos que a
concordância entre ambas não atinge o mesmo nível do caso anterior, como mostrado
na figura 16. Com isso vemos a influência da espessura do aerofólio na acurácia de cada
Capítulo 3. Resultados 21

método, seja pequenas pertubações, seja potencial completo. Neste caso podemos inferir
que a espessura de 10% já é considerável para o método de pequenas perturbações, de modo
que isso leva a diminuir sua acurácia. Já para espessura de 5% vimos melhor concordância.

Figura 16 – Resultados de coeficiente de pressão para os métodos iterativos (método de


pequenas perturbações) em relação à referência (potencial completo), ε < 10−8 .

3.3 Caso III: Independência de Malha


Outra análise que pode ser feita é a influência da malha utilizada. Neste caso
utilizamos o método SLOR com espessura do aerofólio de 10%. Como aumentamos o
número de nós, podemos esperar que uma malha mais fina demanda mais iterações para
atingir a convergência para um mesmo nível de resíduo. Por isso nesse caso não avaliamos
o resíduo e sim o erro para o coeficiente de pressão, errCP . Devemos atentar para o fato
de que errCP não é um resíduo, nosso resíduo continua sendo Lφ, porém o utilizamos para
atestar se uma malha mais fina consegue reduzir o erro no cálculo do coeficiente de pressão.
Esse erro trata-se do desvio entre o coeficiente de pressão dos passos iterativos n + 1 e n.
Foram utilizadas quatro malhas, a partir de nossa malha original, como descrito na tabela
1. A malha 01 é a mesma utilizada em casos anteriores, com 492 nós. A malha 02 tem um
melhor refinamento em todas as direções, chegando a 1215 nós, e por fim a malha 03 tem
Capítulo 3. Resultados 22

Tabela 1 – Malhas utilizadas para estudo.

01 02 03 04
ILE 11 21 31 21
ITE 31 61 71 61
IMAX 41 81 101 81
JMAX 12 15 18 24
XSF 1,25 1,20 1,15 1,20
YSF 1,25 1,20 1,15 1,20

o melhor nível de refinamento para 1818 nós. O fator de estiramento é de respectivamente


1, 25, 1, 20 e 1, 15. Como podemos observar foi priorizada a direção x para o refinamento
da malha.

Figura 17 – Histórico de convergência para o resíduo Lφ e histórico do erro errCP para


critério ε < 10−8 .

Os resultados para convergência do resíduo e histórico do erro para o coeficiente


de pressão são apresentados na figura 17. Nota-se mínima diferença entre os resultados
obtidos para malhas 02 e 03, o que indica que o resultado passa a ser independente da
malha, na direção x, para refino superior ao da malha 02. Porém, como dito anteriormente,
foi priorizada a direção x no refino. Para avaliar a influência da direção y foi feita a malha
Capítulo 3. Resultados 23

04, que apresenta os mesmos parâmetros que a malha 02, porém tem uma malha 2x mais
fina na direção y, obtendo 1944.
O refino para malha 04 acaba demandando um tempo consideravelmente maior para
atingir convergência, com melhora visível do erro calculado para o coeficiente. Porém, esse
erro já é inferor a 10−10 , e portanto neste caso não há justificativa para se utilizar uma malha
com refino superior à da malha 02. Isso também pode ser confirmado com a distribuição
do coeficiente de pressão pode ser avaliada na figura 18. Neste caso vemos que o refino
da malha produz sim melhores resultados, mais próximos do potencial completo, e que
tais resultados para malhas 02, 03 e 04 são equivalentes. Ou seja, considerando a acurácia
alcançada e o tempo demandado para cada malha, não há melhora de custo-benefício para
uma malha mais fina do que a malha 02

Figura 18 – Resultados de coeficiente de pressão para os métodos iterativos (método de


pequenas perturbações) em relação à referência (potencial completo), ε < 10−8 .
Capítulo 3. Resultados 24

3.4 Análise do Escoamento


Finalmente, concluída a análise da influência de cada método na convergência
do cálculo, fazemos a análise dos campos de velocidade e coeficiente de pressão para o
escoamento potencial sobre aerofólio biconvexo, para o método de pequenas perturbações.
Neste caso utilizamos o método SLOR, pois este é o que apresenta melhor taxa de
convergência, com resíduo Lφ tal que ε < 10−8 . A espessura escolhida foi a de 5%. Os
campos de velocidade u e v, bem como o campo de coeficiente de pressão CP foram obtidos
através de curvas de contorno utilizando o software MATLAB.

Figura 19 – Campo de velocidade u para escoamento potencial sobre aerofólio biconvexo


utilizando método SLOR e espessura de aerofólio 5%, ε < 10−8 .

Figura 20 – Campo de velocidade v para escoamento potencial sobre aerofólio biconvexo


utilizando método SLOR e espessura de aerofólio 5%, ε < 10−8 .

É possível observar os pontos de estagnação, onde há velocidade próxima à nula


nos bordos de ataque e de fuga do aerofólio, e consequente aceleração do escoamento entre
Capítulo 3. Resultados 25

os pontos. Os pontos de estagnação também são observados pelo alto coeficiente de pressão
encontrado nestes pontos.

Figura 21 – Campo de coeficiente de pressão CP para escoamento potencial sobre aerofólio


biconvexo utilizando método SLOR e espessura de aerofólio 5%, ε < 10−8 .

Percebemos que os campos avaliados estâo coerentes com o esperado e que os


resultados encontrados para cada método apresentam boa concordância com a referência
para potencial completo. Podemos obter resultados similares para o caso de espessura 10%,
como veremos a seguir. Ao comparar as figuras 19 e 22, e 20 e 23 observamos que com o
aumento de espessura temos uma maior aceleração do escoamento na parede do aerofólio.
Isso é evidenciado principamente para a direção y, onde a velocidade nessa direção acaba
por ser até 100% maior nos bordos de ataque e fuga.

Figura 22 – Campo de velocidade u para escoamento potencial sobre aerofólio biconvexo


utilizando método SLOR e espessura de aerofólio 10%, ε < 10−8 .
Capítulo 3. Resultados 26

Figura 23 – Campo de velocidade v para escoamento potencial sobre aerofólio biconvexo


utilizando método SLOR e espessura de aerofólio 10%, ε < 10−8 .

Por consequência da aceleração do fluido temos a alteração da distribuição de


pressão sobre o aerofólio, onde atingimos maiores valores absolutos de cP para a maior
espessura, o que pode ser averiguado comparando os campos obtidos nas figuras 21 e ??,
e também nos resultados obtidos apresentados nas figuras 11 e 18.

Figura 24 – Campo de coeficiente de pressão CP para escoamento potencial sobre aerofólio


biconvexo utilizando método SLOR e espessura de aerofólio 10%, ε < 10−8 .
27

4 Conclusões

O objetivo deste projeto era a construção de um código capaz de resolver o


escoamento potencial sobre um aerofólio biconvexo utlizando o método de pequenas
perturbações. Assim foram utilizados os métodos de relaxação para encontrar a solução
estacionária para a equação potencial.
O projeto foi salutar para o melhor entendimento dos métodos de relaxação, bem
como a construção do modelo matemático para cada caso aqui avaliado, além de ter
aberto horizontes quanto à importância de condições de contorno implícitas. Os diferentes
métodos iterativos foram avaliados e apresentaram resultados de acordo com o esperado,
com melhores taxas de convergência encontradas para os métodos SOR e SLOR. Isso
indica o quão importante o fator de relaxação é para acelerar o cálculo. O projeto foi
importante no sentido de mostrar que a solução independe do método iterativo utilizado,
porém cada método com sua particularidade pode chegar à tal solução mais rapidamente.
Os resultados aqui produzidos para os métodos de pequenas perturbações estão
em concordância com o valores da referência para potencial completo, o que indica que o
código foi construído de maneira correta.
28

Referências

Recktenwald, G. Relaxation Methods for Iterative Solution to Linear Systems of Equations,


Portland State University, EUA, n.d.

Fletcher, C.A.J. Computational Techniques for Fluid Dynamics 1: Fundamentals and


General Techniques, Springer-Verlag, Heidelberg, 2nd edition, 1991.

Lomax, H., Pulliam, T. H., Zingg, D. W. Fundamentals of Computational Fluid Dynamics,


Springer-Verlag, Heidelberg, 1st edition, 2001.

Azevedo, J. L. F. Notas de Aula: CC-297 Elementos de Mecânica dos Fluidos Computaci-


onal - Projeto No. 1, Instituto Tecnológico da Aeronáutica, Brasil, 2018.

Holst, T. L. Numerical Computation of Transonic Flow Governed by the Full-Potential


Equation, Applied Computational Aerdynamics Branch, NASA Ames Research Center,
EUA, 1983.
Apêndices
30

APÊNDICE A – Código Computacional

Este apêndice contém as rotinas MATLAB para resolução do escoamento potencial


através do método de pequenas perturbações.
30

clear
close all
clc
%% Condições do Escoamento e do Aerofólio:
% O escoamento não perturbado tem componentes de velocidade apenas na
% direção (x), portanto escrevemos:
uo = 1;
% O aerofólio utilizado trata-se de um aerofólio simétrico biconvexo e
% sem sustentação, de espessura normalizada pela corda, t.
% O aerofólio tem equação definica por y(x) = 2tx(1-x), logo sua
% derivada é dada por y_x(x) = 2t(1-2x).
t = 0.05;

%% Escolha do Esquema de Iteração:


% 1 - Jacobi
% 2 - Gauss-Seidel (point)
% 3 - SOR
% 4 - Line-Gauss-Seidel
% 5 - SLOR
choice = 5;
%% Escolha do critério de parada:
% 1 - Operador resíduo
% 2 - Sem resíduo: número máximo de passos (máximo de 12000)
% STP corresponde ao resíduo ou critério de parada (1E-6).
% n corresponde ao número de passos máximo (12000).
res = 1;
% Condições de parada:
STP = 1E-8; % Valor de corte para op. resíduo
N = 12000; % Máximo número de iterações
%% Escolha da opção de plotagem de gráficos de CP e resíduo:
% 1 - Executar plot
graph = 1;
%% Escolha da opção de salvar os resultados num arquivo texto:
% 1 - Executar plot
salve = 0;
%% Malha Computacional:
% Discretização da malha computacional cartesiana de diferenças
finitas:
% Informações iniciais:
ILE = 11; % índice i para bordo de ataque (x)
ITE = 31; % índice i para bordo de fuga (x)
IMAX = 41; % número de pontos na direção x
JMAX = 12; % número de pontos na direção y
XSF = 1.25; % fator de estiramento em x
YSF = 1.25; % fator de estiramento em y
%% Chamada da função principal de cálculo:
[phi,CP,u,v,cont,ER1,ER2] = ...

A_MAIN(choice,res,STP,N,uo,t,graph,salve,ILE,ITE,IMAX,JMAX,XSF,YSF);
31

function [phi,CP,u,v,cont,ER1,ER2] = A_MAIN(choice,res,STP,N,uo,t,graph,...


salve,ILE,ITE,IMAX,JMAX,XSF,YSF)
%A_MAIN é a função que lê os dados de entrada fornecidos pelo script que
%contém informações de malha, resíduo e critérios de parada, bem como as
%condições iniciais da simulação. A função chama as funções:
% - B_MESH: geração de malha;
% - C_SOLVE: cálculo iterativo;
% - G_PLOT: geração de gráficos.

%% Escolha do Esquema de Iteração:


% 1 - Jacobi
% 2 - Gauss-Seidel (point)
% 3 - SOR
% 4 - Line-Gauss-Seidel
% 5 - SLOR
% Seleção do esquema para cálculo:
if choice == 1
R = 0;
fprintf('Método iterativo: Jacobi. Espessura %3.2f%%.',t)
fprintf('\n');
elseif choice == 2
R = 1; % Fator de relaxação
fprintf('Método iterativo: PGS. Espessura %3.2f%%.',t)
fprintf('\n');
elseif choice == 3
R = 1.80; % Fator de relaxação
fprintf('Método iterativo: SOR. Espessura %3.2f%%.',t)
fprintf('\n');
elseif choice == 4
R = 1; % Fator de relaxação
fprintf('Método iterativo: LGS. Espessura %3.2f%%.',t)
fprintf('\n');
else
R = 1.88; % Fator de relaxação
fprintf('Método iterativo: SLOR. Espessura %3.2f%%.',t)
fprintf('\n');
end
%% Malha Computacional:
% Chamada da função para discretização da malha a partir dos dados:
[X,Y,Yx] = B_MESH(t,ILE,ITE,IMAX,JMAX,XSF,YSF);
% A função acima não só retorna as posições
% X e Y dos pontos da malha, como também é
% responsável por disponibilizar a derivada
% dydx na parede do aerofólio.
%% Análise do critério de parada ou convergência:
if res == 2
STP = 1/N;
end
%% Condições iniciais e contorno:
% As condições iniciais são aplicadas em todo o domínio, considerando a
% condição de escoamento não perturbado:
phio(1:JMAX,1:IMAX) = 0;
% Não se deve esquecer que JMAX representa
% as linhas e IMAX representa as colunas
for jj = 1:JMAX
phio(jj,:) = uo*X;
end
% A condição de contorno de Neuman aplicada em J = 1 é constante, ela
% não se altera independentemente da iteração. Onde temos que a
% derivada é dada por phiy(x,0)=uo.dy/dx=uo.y_x(x). Ou seja:
phiy = uo*Yx;
32

% Logo, o cálculo de Lphi em J=1 depende de outra constante, dada por:


phiy = (Y(2)-Y(1))*phiy;

%% Método Iterativo
[phi,CP,u,v,cont,ER1,ER2] = ...
C_SOLVE(choice,R,res,uo,phio,phiy,X,Y,IMAX,JMAX,STP,N);
%% Saída para fim de cálculo:
fprintf('-Fim de cálculo para %d iterações e resíduo %13.12f.',...
cont,ER1(end))
fprintf('\n');
fprintf('\n');
%% Análise gráfica de convergência e coeficiente de pressão:
if graph == 1
G_PLOT(X,ILE,ITE,phi,Yx,uo,t,ER1,ER2);
end
%% Salvando arquivos:
if salve == 1
% Escrevendo os vetores X e Y no formato matricial:
XX(1:JMAX,1:IMAX) = 0;
for jj = 1:JMAX
XX(jj,:) = X;
end
YY(1:JMAX,1:IMAX) = 0;
for ii = 1:IMAX
YY(:,ii) = Y;
end
% Determinando as strings para nomenclatura de arquivo
% Tipo de método:
if choice == 1
choice = '01JACOBI';
elseif choice == 2
choice = '02PGS';
elseif choice == 3
choice = '03SOR';
elseif choice == 4
choice = '04LGS';
elseif choice == 5
choice = '05SLOR';
end
% Tipo de convergència:
res = sprintf('%d', res);
% Amrazenando os arquivos de interesse:
name = [choice '_01X_RES0' res '.txt'];
fid = fopen(name,'wt');
for jj = 1:JMAX
fprintf(fid,'%g\t',XX(jj,:));
fprintf(fid,'\n');
end
fclose(fid);

name = [choice '_02Y_RES0' res '.txt'];


fid = fopen(name,'wt');
for jj = 1:JMAX
fprintf(fid,'%g\t',YY(jj,:));
fprintf(fid,'\n');
end
fclose(fid);

name = [choice '_03PHI_RES0' res '.txt'];


fid = fopen(name,'wt');
for jj = 1:JMAX
33

fprintf(fid,'%g\t',phi(jj,:));
fprintf(fid,'\n');
end
fclose(fid);

name = [choice '_04U_RES0' res '.txt'];


fid = fopen(name,'wt');
for jj = 1:JMAX
fprintf(fid,'%g\t',u(jj,:));
fprintf(fid,'\n');
end
fclose(fid);

name = [choice '_05V_RES0' res '.txt'];


fid = fopen(name,'wt');
for jj = 1:JMAX
fprintf(fid,'%g\t',v(jj,:));
fprintf(fid,'\n');
end
fclose(fid);

name = [choice '_06CP_RES0' res '.txt'];


fid = fopen(name,'wt');
for jj = 1:JMAX
fprintf(fid,'%g\t',CP(jj,:));
fprintf(fid,'\n');
end
fclose(fid);
end
end
34

function [Xo,Yo,Yx] = B_MESH(t,ILE,ITE,IMAX,JMAX,XSF,YSF)


%B_Mesh é uma função para discretização da malha computacional 2D.

% A malha tem discretização constante na parede do aerofólio, portanto:


dx = 1.0/(ITE - ILE); % discretizção em (x) para ILE<i<ITE
% esse valor já está normalizado pela corda
% Discretização da malha e obtenção da derivada phiy:
% Direção (x):
Xo(1,1:IMAX) = 0; % Criação do vetor de posição em (x)
Yx(1,1:IMAX) = 0; % Vetor para tangente do aerofólio

for ii = ILE:ITE % Discretização da fronteira do aerofólio


Xo(ii) = (ii - ILE)*dx;
Yx(ii) = 2*t*(1 - 2*Xo(ii));
end
for ii = ITE+1:IMAX % Discretizção após aerofólio (estiramento)
Xo(ii) = Xo(ii-1) + (Xo(ii-1) - Xo(ii-2))*XSF;
end
for ii = ILE-1:-1:1 % Discr. após aerofólio (estiramento)
Xo(ii) = Xo(ii+1) + (Xo(ii+1) - Xo(ii+2))*XSF;
end
% Direção (y)
Yo(1:JMAX,1) = 0; % Criação do vetor de posição em (y)
Yo(1) = -dx/2;
Yo(2) = dx/2;
for jj = 3:JMAX
Yo(jj) = Yo(jj-1) + (Yo(jj-1) - Yo(jj-2))*YSF;
end
end
35

function [phi,CP,u,v,cont,ER1,ER2] = ...


C_SOLVE(choice,R,res,uo,phio,phiy,X,Y,IMAX,JMAX,STP,N)
%C_SOLVE realiza o loop de cálculo para a rotina A_MAIN. A função é
%responsável por chamar cada método iterativo e avaliar a convergência ou
%não da simulação.

% Determinação da matriz phi na iteração (n) -> phi(n):


phin(1:JMAX,1:IMAX) = phio(1:JMAX,1:IMAX);
% Fator de convergência:
err = 1;
% Declaração da variável para coeficiente de pressão:
CPn (1:JMAX,1:IMAX) = 0;
% Declaração das constantes para matriz de Thomas:
AAA(1,1:JMAX-2) = 0;
BBB(1,1:JMAX-2) = 0;
CCC(1,1:JMAX-2) = 0;
RHS(1,1:JMAX-2) = 0;
% Determinação da matriz phi na iteração (n+1) -> phi(n+1):
phi(1:JMAX,1:IMAX) = 0;
% Contador de iterações
cont = 0;

while err > STP


%% Inicialização da iteração:
% Atualização do contador:
cont = cont + 1;
% Atualização da condição de contorno de phi(n) em J = 1:
phin(1,:) = phin(2,:) - phiy;
% Declaração da matriz corretora, atualizada passo a passo:
C(1:JMAX,1:IMAX) = 0;
% Declaração da matriz do operador resíduo:
Lphi(1:JMAX,1:IMAX) = 0;
%% Cálculo do operador resíduo:
% Entrada de coluna -> caminho em (x):
for ii = 2:(IMAX-1)
% Entrada de linha -> caminho em (y):
for jj = 2:(JMAX-1)
% Cálculo das variações espaciais em (x):
dxo = (X(ii+1)-X(ii-1));
dxf = (X(ii+1)-X(ii));
dxb = (X(ii)-X(ii-1));
% Cálculo das variações espaciais em (y):
dyo = (Y(jj+1)-Y(jj-1));
dyf = (Y(jj+1)-Y(jj));
dyb = (Y(jj)-Y(jj-1));
% Cálculo do operador:
Lphi(jj,ii) = ((2/dxo)*((phin(jj,ii+1) - phin(jj,ii))/dxf - ...
(phin(jj,ii) - phin(jj,ii-1))/dxb))+...
((2/dyo)*((phin(jj+1,ii) - phin(jj,ii))/dyf - ...
(phin(jj,ii) - phin(jj-1,ii))/dyb));
end
end
%% Análise de convergência:
ER1(cont) = Z_MAX(Lphi);
% Cálculo do erro para CP:
[u,v,CP] = F_POST(X,Y,IMAX,JMAX,phi,uo);
ER2(cont) = Z_MAX((CP - CPn));
% Critério de parada: convergência para operador resíduo.
if res == 1
err = ER1(cont);
% Critério de parada: número máximo de iterações.
36

elseif res == 2
err = 1/cont;
end
%% Parada de simulaçâo:
% Critério de parada: número máximo de iterações:
if cont > (N-1)
fprintf('-Número máximo de iterações alcançado: %d.',N)
fprintf('\n');
break
end
% Divergência encontrada:
if ER1(cont) > 1E5
fprintf('-Divergência. Resíduo: %13.12f.',ER1(cont))
fprintf('\n');
break
end
%% Cálculo do operador correção:
% Entrada de coluna -> caminho em (x):
for ii = 2:(IMAX-1)
% Entrada de linha -> caminho em (y):
for jj = 2:(JMAX-1)
%% Chamada para método de Jacobi:
if choice == 1
% Obtenção do operador resíduo e de C(n)(ii,jj):
[C(jj,ii)] = D_JACO(X,Y,ii,jj,Lphi(jj,ii));
end
%% Chamada para métodos PGS e SOR:
if choice == 2 || choice == 3
% Obtenção do operador resíduo e de C(n)(ii,jj):
[C(jj,ii)] = D_SOR(X,Y,ii,jj,C,R,Lphi(jj,ii));
end
%% Chamada para métodos LGS e SLOR:
if choice == 4 || choice == 5
% Obtenção do operador resíduo e dos coeficientes:
[COEF] = D_SLOR(X,Y,ii,jj,C,R,Lphi(jj,ii));
% Determinação dos coeficientes da matriz de Thomas:
AAA(jj-1) = COEF(1);
BBB(jj-1) = COEF(2);
CCC(jj-1) = COEF(3);
% Vetor resposta para cálculo B(AAA,BBB,CCC)*C = RHS:
RHS(jj-1) = COEF(4);
end
end
if choice == 4 || choice == 5
%% Cálculo para métodos LGS e SLOR - Algorítimo de Thomas:
% Obtenção da matriz corretora C(n)(ii,jj):
[C(2:(JMAX-1),ii)] = E_THOM(AAA,BBB,CCC,RHS,JMAX-2);
end
end
%% Cálculo de phi(n+1):
phi (1:JMAX,1:IMAX) = C (1:JMAX,1:IMAX) + phin(1:JMAX,1:IMAX);
%% Atualização para próximo passo:
phin(1:JMAX,1:IMAX) = phi(1:JMAX,1:IMAX);
CPn (1:JMAX,1:IMAX) = CP (1:JMAX,1:IMAX);
end
end
37

function [C] = D_JACO(X,Y,ii,jj,LPHI)


% D_JACO aplica o método iterativo de Jacobi.

%% Cálculo das variações espaciais em (x):


dxo = (X(ii+1)-X(ii-1));
%% Cálculo das variações espaciais em (y):
dyo = (Y(jj+1)-Y(jj-1));
%% Cálculo dos deltas espaciais ao quadrado:
dxx = ((dxo)/2)^2; % Centrado
dyy = ((dyo)/2)^2; % Centrado
%% Método de Jacobi:
% Cálculo do operador iterativo (Jacobi):
N = (-2)*(1/dxx + 1/dyy);
% Cálculo da matriz corretora C(n)(jj,ii):
C = LPHI*(-1)/N;
end
38

function [COEF] = D_SLOR(X,Y,ii,jj,C,R,LPHI)


% D_SLOR aplica o método iterativo de line-Gauss-Seidel ou SLOR. Aqui a
% condição de contorno é avaliada implicitamente.

%% Cálculo das variações espaciais em (x):


dxo = (X(ii+1)-X(ii-1));
%% Cálculo das variações espaciais em (y):
dyo = (Y(jj+1)-Y(jj-1));
dyf = (Y(jj+1)-Y(jj));
dyb = (Y(jj)-Y(jj-1));
%% Cálculo dos deltas espaciais ao quadrado:
dxx = ((dxo)/2)^2;
%% Métodos line-Gauss-Seidel & Successive Line Overelaxation SLOR:
% OBS.: aqui apenas são calculados os coeficientes para cálculo da
% matriz de Thomas, ou seja, para eliminação gaussiana.

% Cálculo dos coeficientes da matriz de Thomas:


AAA = 2/((dyo*dyb*R));
BBB = 2/R*(1/dxx + 1/(dyo*dyf) + 1/(dyo*dyb))*(-1);
CCC = 2/((dyo*dyf*R));
if jj == 2
% Inserção da condição de contorno implícita:
BBB = BBB + AAA;
AAA = 0;
end
% Cálculo para B(AAA,BBB,CCC)*C = RHS:
RHS = (LPHI + C(jj,ii-1)/dxx)*(-1);
% Armazenamento:
COEF = [AAA BBB CCC RHS];
end
39

function [CIJ] = D_SOR(X,Y,ii,jj,C,R,LPHI)


% D_SOR aplica o método iterativo de point-Gauss-Seidel ou SOR. Aqui a
% condição de contorno é avaliada implicitamente.

%% Cálculo das variações espaciais em (x):


dxo = (X(ii+1)-X(ii-1));
%% Cálculo das variações espaciais em (y):
dyo = (Y(jj+1)-Y(jj-1));
%% Cálculo dos deltas espaciais ao quadrado:
dxx = ((dxo)/2)^2; % Centrado
dyy = ((dyo)/2)^2; % Centrado
%% Método point-Gauss-Seidel & Successive Overelaxation SOR:
% Cálculo das constantes para SOR:
DDD = 2*(1/dxx + 1/dyy);
DDX = 2*(1 + dxx/dyy);
DDY = 2*(dyy/dxx + 1);
% Cálculo da matriz corretora C(n)(jj,ii):
if jj == 2
% Inserção da condição de contorno implícita:
CIJ = ((LPHI/DDD) + C(jj,ii-1)/DDX)/(1/R - 1/DDY);
else
% Cálculo dos nós interiores para além da linha adjacente:
CIJ = ((LPHI/DDD) + C(jj,ii-1)/DDX + C(jj-1,ii)/DDY)*R;
end
end
40

function [CC] = E_THOM(A,B,C,D,S)


% E_THOM realiza o cálculo do algorítimo de Thomas para avaliação linha a
% linha.

%% Método Forward Sweep para uso da elminação gaussiana (pivotamento):


for jj = 1:S-1
% Cálculo dos novos coeficientes A, B, C e D:
if jj == 1
C(jj) = C(jj)/B(jj);
D(jj) = D(jj)/B(jj);
else
C(jj) = (C(jj))/(B(jj) - A(jj)*C(jj-1));
D(jj) = (D(jj) - A(jj)*D(jj-1))/(B(jj) - A(jj)*C(jj-1));
end
end
jj = S;
D(jj) = (D(jj) - A(jj)*D(jj-1))/(B(jj) - A(jj)*C(jj-1));
%% Obtenção do vetor de resposta:
% Cálculo do último elemento:
CC(S) = D(S);
% Varredura descendente:
for jj=(S-1):-1:1
CC(jj) = D(jj) - C(jj)*CC(jj+1);
end
%% Conversão de vetor linha para vetor coluna:
CC = CC';
end
41

function [u,v,CP] = F_POST(X,Y,IMAX,JMAX,phi,uo)


%F_POST calcula o campo de velocidade e o campo para CP no domínio.

% Declaração das matrizes velocidade:


u (1:JMAX,1:IMAX) = 0;
v (1:JMAX,1:IMAX) = 0;
V (1:JMAX,1:IMAX) = 0;
CP(1:JMAX,1:IMAX) = 0;
% Loop de cálculo
for jj = 1:JMAX
for ii = 1:IMAX
%% Cálculo da velocidade em (x):
if ii == 1
u(jj,ii) = (phi(jj,ii+1) - phi(jj,ii))/...
(X(ii+1) - X(ii));
elseif ii == IMAX
u(jj,ii) = (phi(jj,ii) - phi(jj,ii-1))/...
(X(ii) - X(ii-1));
else
u(jj,ii) = (phi(jj,ii+1) - phi(jj,ii-1))/...
(X(ii+1) - X(ii-1));
end
%% Cálculo da velocidade em (y):
if jj == 1
v(jj,ii) = (phi(jj+1,ii) - phi(jj,ii))/...
(Y(jj+1) - Y(jj));
elseif jj == JMAX
v(jj,ii) = (phi(jj,ii) - phi(jj-1,ii))/...
(Y(jj) - Y(jj-1));
else
v(jj,ii) = (phi(jj+1,ii) - phi(jj-1,ii))/...
(Y(jj+1) - Y(jj-1));
%% Cálculo do quadradado da magnitude da velocidade:
V(jj,ii) = (u(jj,ii))^2 + (v(jj,ii))^2;
%% Cálculo do coeficiente de pressão local:
CP(jj,ii) = 1 - V(jj,ii)/(uo^2);
end
end
end
end
42

function [u,v] = G_PLOT(X,ILE,ITE,phi,Yx,uo,t,ER1,ER2)


%G_PLOT gera os gráficos para visualização do coeficiente de pressão, da
%evolução do resíduo e os erros de cálculo.

%% Cálculo da velocidade em (x)


% Declaração dos vetores:
u(1,1:ITE-ILE+1) = 0;
V(1,1:ITE-ILE+1) = 0;
% Loop de cálculo
for ii = ILE:ITE
% Propriedade na linha J = 1:
UJ1 = (phi(1,ii+1) - phi(1,ii-1))/...
(X(ii+1) - X(ii-1));
% Propriedade na linha J = 2:
UJ2 = (phi(2,ii+1) - phi(2,ii-1))/...
(X(ii+1) - X(ii-1));
% Propriedade na linha J = 1.5:
u(ii - ILE + 1) = (UJ1 + UJ2)/2;
end
%% Cálculo da velocidade em (y):
v = uo*Yx(ILE:ITE);
%% Cálculo do quadrado da magnitude:
for ii = 1:ITE-ILE+1
V(ii) = (u(ii))^2 + (v(ii))^2;
end
%% Cálculo do coeficiente de pressãoe e do vetor posição:
CP = 1 - V/(uo^2);
XC = X(ILE:ITE);
%% Solução Full Potential
if t == 0.05
XCo = 0:0.05:1;
CPo = [-0.11456 0.00111 0.04022...
0.06819 0.08909 0.10500...
0.11706 0.12593 0.13203...
0.13561 0.13678 0.13561...
0.13204 0.12594 0.11706...
0.10501 0.08910 0.06819...
0.04023 0.00111 -0.11456]*(-1);
elseif t == 0.10
XCo = [ 0.9991 0.9952 0.9903 0.9842 0.9766...
0.9673 0.9559 0.9410 0.9248 0.9042...
0.8795 0.8503 0.8162 0.7770 0.7534...
0.7326 0.6833 0.6299 0.5733 0.5147...
0.4853 0.4267 0.3701 0.3167 0.2674...
0.2466 0.2230 0.1838 0.1497 0.1205...
0.0958 0.0752 0.0590 0.0441 0.0327...
0.0234 0.0158 0.0097 0.0048 0.0009];
CPo = [ 0.4294 0.3838 0.3069 0.2438 0.1910...
0.1447 0.1021 0.0615 0.0219 -0.0173...
-0.0563 -0.0947 -0.1321 -0.1676 -0.1843...
-0.2001 -0.2280 -0.2500 -0.2647 -0.2712...
-0.2712 -0.2647 -0.2500 -0.2280 -0.2001...
-0.1843 -0.1676 -0.1321 -0.0947 -0.0563...
-0.0173 0.0219 0.0615 0.1021 0.1447...
0.1910 0.2438 0.3069 0.3838 0.4294];
end

figure(1)
semilogy(ER1,'linewidth',2)
hold on
semilogy(ER2,'linewidth',2)
43

hold off
grid on
grid minor
xlabel('Iteração')
ylabel('log10')
legend('L\phi','err_{CP}')

figure(2)
plot(XC ,-CP ,'d',...
XCo,-CPo,'linewidth',2)
grid on
grid minor
xlabel('x/c')
ylabel('-c_P')
legend('Resultado','Referência')
end
44

function [ANS] = Z_MAX(FUN)


% Z_MAX determina o valor máximo absoluto de uma matriz ou vetor.

% Declaração do valor resposta a ser avaliado:


ANS = 0;
% Leitura do tamanho da matriz ou vetor de entrada:
[m,n] = size(FUN);
% Início do cálculo para determinação do máximo valor de FUN:
for jj = 1:m
for ii = 1:n
% Leitura do valor local:
AUX = FUN(jj,ii);
% Avaliação se o mesmo é negativo:
if AUX < 0
% Caso negativo, avaliamos seu valor absoluto:
AUX = AUX*(-1);
end
% Avaliação se o valor é maior que nosso valor ANS inicial:
if AUX > ANS
% Caso positivo, o valor de ANS é atualizado:
ANS = AUX;
end
end
end
end

Você também pode gostar