Você está na página 1de 24

UNIVERSIDADE FEDERAL DE SANTA CATARINA

DEPARTAMENTO DE ENGENHARIA MECNICA


EMC 5412 TRANSFERNCIA DE CALOR E MECNICA DOS FLUIDOS COMPUTACIONAL
RELATRIO X
CAVIDADE COM TAMPA DESLIZANTE
GUSTAVO TRENTINI HAMESTER
11200808
FLORIANPOLIS
Julho de 2013
1 Introduo
Como relatrio nal do curso foi proposta a simulao do movimento de um uido
dentro de uma cavidade retangular. O uido est parado at que em um momento a
tampa da cavidade passa a se movimentar com velocidade de 1 m/s o que far com que
o uido circule dentro do domnio de estudo. Embora a velocidade da tampa seja xa,
pode-se alterar a viscosidade do uido de modo a obter diferentes pers de velocidade
para o escoamento. Nos diversos testes a viscosidade ser alterada atravs do nmero de
Reynolds que denido como: Re =
V L

, onde a massa especca, V a velocidade, L


a aresta da cavidade e a viscosidade.
Figura 1: Cavidade Quadrada
2 Discusso
A simulao do escoamento incompressvel em uma cavidade retangular consiste em
resolver a equao de conservao da quantidade de movimento na direo x, da quanti-
dade de movimento na direo y e da massa. A equao geral de conservao bidimensi-
onal :

t
( ) +

x
( u ) +

y
( v ) =

x
_


x
_
+

y
_


y
_
+ S

(1)
Onde os termos gerais assumem os seguintes valores:
Tabela 1: Termos para cada equao
Conservao da Q.M. em x Q.M. em y Massa
u v 1

0
S

-
P
x
-
P
y
0
1
Neste problema a massa especca, , e a viscosidade, , so tratadas como constantes
do uido. Antes de integrar as equaes sobre um volume como era feito nos outros
relatrios deve-se fazer mais algumas consideraes iniciais.
2.1 Equaes No-Lineares
A no-linearidade de (1) para a quantidade movimento na direo x e y uma das
diculdades impostas. Contudo, nesse curso j trabalhou-se com esse tipo de problema
quando tinha-se a condutividade trmica dependente da temperatura. A soluo empre-
gada para tratar a no-lineariadade ser estimar um campo de velocidades e resolver as
equaes iterativamente.
2.2 Malha Desencontrada
Em todos os relatrios anteriores o termo fonte era nulo, ou seja, bastava encontrar a
distribuio de temperatura devido as condies iniciais. Entretanto aqui o termo fonte
representado como o gradiente de presso no volume de controle. O surgimento do termo
fonte no trs uma aparente diculdade, porm, por exemplo, discretizando-se o termo
-
P
x
, utilizando uma malha com as propriedades co-localizadas e igualmente espaada, o
gradiente de presso dentro do volume de controle se torna P
w
P
e
. O signicado fsico
para P
w
P
e
exato at o momento o qual aproxima-se a presso nas faces pela mdia
aritmtica das presses vizinhas:
P
P
+P
W
2

P
P
+P
E
2
=
P
W
P
E
2
. Ento, se as variveis forem
co-localizadas o campo de presso ser mais grosseiro que a malha com a qual pretendia-
se trabalhar e o gradiente dentro de um volume de controle no depender da sua prria
presso. Esse fato permite, por exemplo, que o programa interprete um campo de presses
alternado como uniforme, o que est longe de ser aceitvel.
Figura 2: Desencontro das Malhas das Equaes de Conservao. Verde: Q.M. em y.
Vermelho: Q.M. em x. Preto: Massa
A soluo, descrita por Patankar (1980), trabalhar com malhas desencontradas para
u, v e P, ou seja, cada equao de conservao possui uma malha prpria que se conecta
2
com as outras atravs de um padro estabelecido pelo desenvolvedor. A utilizao desse
mtodo , simultaneamente, genial e custosa, anal trs ao programa uma carga de inde-
xao, mas o esforo empregado vlido. A gura (2) ilustra o desencontro das malhas
utilizando o mtodo boomerang para conectar as malhas.
2.3 Integrao e Discretizao da Equao de Conservao da Quanti-
dade de Movimento em x
A discretizao dessa equao seguir o esquema de volume de controle genrico para
u ilustrado abaixo com as propriedades vizinhas das outras malhas. Nas equaes seguin-
tes a propriedade que est sendo integrada ser chamada de para no gerar conito com
as velocidades dos termos advectivos.
Figura 3: Volume de Controle de u
Integrando a equao 1 sobre o volume de controle e do tempo t at t +t:
t+t
_
t
y
n
_
y
s
x
e
_
x
w
_

x
( u ) +

y
( v ) +

t
( )
_
l dx dy dt =
t+t
_
t
y
n
_
y
s
x
e
_
x
w
_

x
_


x
_
+

y
_


y
_

P
x
_
l dx dy dt (2)
3
O termo l a profundidade da cavidade.
t+t
_
t
y
n
_
y
s
[( u )
e
( u )
w
] l dy dt +
t+t
_
t
x
e
_
x
w
[( v )
n
( v )
s
] l dx dt
+
y
n
_
y
s
x
e
_
x
w
_
( )
t+t
( )
t
_
l dx dy =
t+t
_
t
x
e
_
x
w
__


y
_
n


y
_
s
_
l dx dt
+
t+t
_
t
y
n
_
y
s
__


x
_
e


x
_
w
_
l dy dt
t+t
_
t
y
n
_
y
s
(P
e
P
w
) l dy dt (3)
Integrando em y de y
s
at y
n
vm: y. Integrando em x de x
w
at x
e
vm: x. Integrando
em t de t at t + t vm: t. Alterando a notao do tempo de t para o em referncia a
old, e deixando t +t sem sobrescrito, vm:
[( u )
e
( u )
w
] l y t + [( v )
n
( v )
s
] l x t +
_
(
P
) (
P
)
o

l x y =
__


y
_
n


y
_
s
_
l x +
__


x
_
e


x
_
w
_
l y (P
e
P
w
) l y t (4)
Alterando a notao dos termos advectivos, discretizando as derivadas e dividindo os dois
lados por t:
M
e

e
M
w

w
+ M
n

n
M
s

s
+ (
P

o
P
)
M
o
P
t
= (P
e
P
w
) l y
+
_
(
N

P
)
_

y
_
n
(
P

S
)
_

y
_
s
_
l x +
_
(
E

P
)
_

x
_
e
(
P

W
)
_

x
_
w
_
l y
(5)
Aps este passo as discretizaes para os esquemas CDS e UDS seguem caminhos distin-
tos. Alterando a notao dos termos difusivos:
_
D
n
+ D
s
+ D
e
+ D
w
+
M
o
P
t
_

P
= (P
w
P
e
) l y +
M
o
P
t

o
P
+
D
n

N
+ D
s

S
+ D
e

E
+ D
w

W
M
e

e
+ M
w

w
M
n

n
+ M
s

s
(6)
2.3.1 Esquema CDS
Como j foi discutido em relatrios anteriores, e sabendo que a malha utilizada igual-
mente espaada, o Central Differencing Scheme aproxima a propriedade em questo nas fa-
ces fazendo a mdia aritmtica do valor a montante com o valor a jusante da face. Alm
disso, nesse trabalho deve-se ter cuidado na avaliao dos uxos de massa nas faces do vo-
lume de controle, entretanto o uxo tambm calculado pela mdia dos valores vizinhos.
4
Ento os uxos de massa so avaliados como:
M
e
= u
e
l y =
_
u
E
+ u
P
2
_
l y (7a)
M
w
= u
w
l y =
_
u
W
+ u
P
2
_
l y (7b)
M
n
= v
n
l x =
_
v
E
+ v
P
2
_
l x (7c)
M
s
= v
s
l x =
_
v
SE
+ v
S
2
_
l x (7d)
Ento a equao discretizada para a quantidade de movimento na direo x :
_
D
n
+ D
s
+ D
e
+ D
w

M
e
2
+
M
w
2

M
n
2
+
M
s
2
_

P
= (P
P
P
E
) l y +
M
o
P
t

o
P
+
_
D
n

M
n
2
_

N
+
_
D
s
+
M
s
2
_

S
+
_
D
e

M
e
2
_

E
+
_
D
w
+
M
w
2
_

W
(8)
2.3.2 Esquema UDS
O Upwind Differencing Scheme determina que a propriedade avaliada na face receba
o maior valor entre as propriedades vizinhas. Portanto a discretizao ca:
(D
n
+ D
s
+ D
e
+ D
w
+ [M
E
, 0] + [M
W
, 0] + [M
N
, 0] + [M
S
, 0])
P
=
(P
P
P
E
) l y +
M
o
P
t

o
P
+ (D
n
+ [M
N
, 0])
N
+ (D
s
+ [M
S
, 0])
S
+
(D
e
+ [M
E
, 0])
E
+ (D
w
+ [M
W
, 0])
W
(9)
Onde os colchetes so uma notao do Patankar (1980) e so denidos como um operador
que retorna o maior valor.
2.4 Integrao e Discretizao da Equao de Conservao da Quanti-
dade de Movimento em y
Os passos para integrar e discretizar essa equao so anlogos anterior, portanto
rearranja-se a equao (6) apenas alterando como avaliada a presso.
5
Figura 4: Volume de Controle de v
_
D
n
+ D
s
+ D
e
+ D
w
+
M
o
P
t
_

P
= (P
s
P
n
) l x +
M
o
P
t

o
P
+
D
n

N
+ D
s

S
+ D
e

E
+ D
w

W
M
e

e
+ M
w

w
M
n

n
+ M
s

s
(10)
A aplicao dos esquemas de interpolao UDS e CDS no tem alteraes em relao
as equaes (8) e (9). A principal diferena aparece na avaliao dos uxos de massa nas
faces do volume de controle na malha da velocidade v.
M
e
= u
e
l y =
_
u
N
+ u
P
2
_
l y (11a)
M
w
= u
w
l y =
_
u
NW
+ u
W
2
_
l y (11b)
M
n
= v
n
l x =
_
v
N
+ v
P
2
_
l x (11c)
M
s
= v
s
l x =
_
v
S
+ v
P
2
_
l x (11d)
2.5 Integrao e Discretizao da Equao de Conservao da Massa
A utilizao da malha desencontrada permite que a conservao da massa seja facil-
mente discretizada.
6
Figura 5: Volume de Controle de P
Ao substituir os respectivos termos da tabela 2 na equao da massa vm:

t
() +

x
( u) +

y
( v) = 0 (12)
Como uma constante:
u
x
+
v
y
= 0 (13)
Integrando sobre o volume de controle:
y
n
_
y
s
x
e
_
x
w
_
u
x
+
v
y
_
l dx dy = 0 (14)
(u
e
u
w
) l y + (v
n
v
s
) l x = 0 (15)
Baseando-se no esquema da gura (5):
(u
P
u
W
) l y + (v
P
v
S
) l x = 0 (16)
2.6 Volumes de Fronteira
A condies de contorno foram introduzidas sem a utilizao de volumes ctcios por
isso faz-se necessrio um novo balano para os volumes de fronteira.
2.6.1 Fronteira Norte da Malha de u
O uxo de massa que passa pela fronteira norte da malha de u nula. Entretanto deve-
se tomar cuidado na avaliao da parcela difusiva. Como no existe o vizinho norte deste
volume de controle interpola-se u do centro do volume de controle com o valor prescrito
na face norte. O valor prescrito, u
n
, velocidade da tampa. Durante a construo do
sistema linear a velocidade da placa adicionada ao termo independente.

u
y

n
=
u
N
u
P
(y)
n
=
u
n
u
P
(y)
n/2
(17)
7
2.6.2 Fronteira Sul da Malha de u
O uxo de massa nessa fronteira tambm nulo e a avalia-se a parcela difusiva de
maneira semelhante. A diferena est no valor prescrito de u na face. Como a base da
cavidade no se movimenta u
s
= 0.

u
y

s
=
u
P
u
S
(y)
s
=
u
P
u
s
(y)
s/2
(18)
2.6.3 Fronteiras Leste da Malha de v
Pela fronteira leste dessa malha no h entrada de massa, portanto M
e
= 0. Sabendo
que v
e
= 0:

v
x

e
=
v
E
v
P
(x)
e
=
v
e
v
P
(x)
e/2
(19)
2.6.4 Fronteiras Oeste da Malha de v
Analogamente a fronteira leste, sabe-se que M
w
nulo e v
w
= 0:

v
x

w
=
v
P
v
W
(x)
w
=
v
P
v
w
(x)
w/2
(20)
2.6.5 Demais Fronteiras das Malhas de u e v
Para caracterizar a cavidade retangular deve-se xar todas as demais velocidades loca-
lizadas sobre a face do domnio em 0.
2.6.6 Fronteiras da Malha de P
A fronteira da malha de conservao da massa coincide com os bordos da cavidade.
Analisando a gura (5) v-se que as velocidades esto todas localizadas nas faces dos
volumes de controle. Consequetemente, no necessrio fazer nenhum novo balano.
2.7 Formato da Matriz
O uso de malhas desencontradas acaba gerando uma matriz blocada pelo cruzamento
das equaes. Na matriz abaixo possvel visualizar que no bloco da equao da con-
servao da massa (A
pu
, A
pv
, A
pp
) h um coeciente multiplicando um valor de presso.
Embora a presso aparea nessa equao, xa-se uma das incgnitas da presso para
obter-se um sistema de soluo nica.
8
Figura 6: Estrutura da Matriz de Coecientes - Malha 3x3
2.8 Mtodo Numrico
Inicialmente o programa recebia as informaes do nmero de volumes, nmero de
Reynolds e tamanho do passo no tempo. Em seguida era construda a matriz de coe-
cientes e o vetor b. Como as equaes no eram lineares iterava-se at que a norma
innita da diferena entre o vetor soluo da iterao atual com o vetor soluo anterior
seja menor que um . Ento resolvia-se mais uma vez o sistema linear, fora do loop da
no-linearidade, e andava-se no tempo at atingir o regime permanente.
O sistema linear era resolvido utilizando o Generalized Minimal Residual Method (GM-
Res). Eventualmente esse solver apresentou problemas para convergncia quando utilizava-
se um nmero de Reynolds mais alto. De maneira a tentar facilitar a convergncia foi
reduzido o t e dessa maneira foi possvel obter uma soluo utilizando CDS e Reynolds
1000.
3 Resultados
A prospeco de resultados foi realizada atravs de malhas 50x50. Malhas mais gros-
seiras eventualmente no captavam as recirculaes em alguns cantos da cavidade e as
mais renadas exigiam um grande esforo computacional sem melhora signicativa na
soluo.
As linhas de corrente foram calculadas utilizando:
u =

y
v =

x
(21)
9
3.1 Campo de Presso e Linhas de Corrente
O campo de presso nas guras abaixo dado em relao a presso do canto inferior
esquerdo. Percebe-se na parte superior da cavidade que a presso mais alta na parede
direita do que na esquerda. Esse fato era esperado pois o uido est se chocando com
a parede direita, enquanto que isso no ocorre no outro lado. A medida que aumenta-
se o Reynolds percebe-se que a baixa presso presente no canto superior esquerdo acaba
conduzindo parte do uido para aquela regio gerando a quina evidente para Reynolds
1000. Alm disso o UDS parece suavizar os gradientes de presso.
As linhas de corrente para Reynolds 100 apresentam seu centro deslocadas do centro da
cavidade, entretanto para 400 esse deslocamento no to aparente e, praticamente, no
havendo para Reynolds 1000. Atenta-se tambm, a presena de recirculaes nos cantos
inferiores, sendo o vrtice direito mais evidente que o esquerdo.
(a) CDS (b) UDS
Figura 7: Reynolds 100
10
(a) CDS (b) UDS
Figura 8: Reynolds 400
(a) CDS (b) UDS
Figura 9: Reynolds 1000
3.2 Comparao com o Trabalho de U. Ghia, K. N. Ghia e C. T. Shin
Analisando os grcos abaixo, v-se que os resultados foram muito bons com o CDS
e razoveis para o UDS. Deve ser levado em conta que no trabalho a malha utilizada
129x129, algo impraticvel sem o mtodo multigrid. Apesar da malha ser mais grosseira
as velocidades com CDS quase sempre coincidem com os de referncia. A principal ex-
ceo aparece na velocidade V para Reynolds 400, onde um ponto de referncia aparece
completamente fora do resultado obtido nesse relatrio. Acredita-se que pelo fato deles
terem utilizado uma malha to renada, foi possvel captar essa variao da velocidade.
11
Comparando os resultados, das velocidades no centro da cavidade com UDS e CDS e com
os campos de presses obtidos, e sabendo que a fora motriz das velocidades a variao
da presso, parece plausvel armar que o UDS ameniza o gradiente de presso o que gera
a diferena presente nos grcos abaixo.
-0,4 -0,2 0,0 0,2 0,4 0,6 0,8 1,0 1,2
0,0
0,2
0,4
0,6
0,8
1,0


UDS
Y
U
CDS
Ghia
(a) Velocidade U no Centro da Cavidade
0,0 0,2 0,4 0,6 0,8 1,0
-0,3
-0,2
-0,1
0,0
0,1
0,2


V
X
UDS
CDS
Ghia
(b) Velocidade V no Centro da Cavidade
Figura 10: Reynolds 100
-0,4 -0,2 0,0 0,2 0,4 0,6 0,8 1,0
0,0
0,2
0,4
0,6
0,8
1,0


Y
U
UDS
CDS
Ghia
(a) Velocidade U no Centro da Cavidade
0,0 0,2 0,4 0,6 0,8 1,0
-0,5
-0,4
-0,3
-0,2
-0,1
0,0
0,1
0,2
0,3
0,4


V
X
UDS
CDS
Ghia
(b) Velocidade V no Centro da Cavidade
Figura 11: Reynolds 400
12
-0,4 -0,2 0,0 0,2 0,4 0,6 0,8 1,0
0,0
0,2
0,4
0,6
0,8
1,0

Y
U
UDS
CDS
Ghia
(a) Velocidade U no Centro da Cavidade
0,0 0,2 0,4 0,6 0,8 1,0
-0,6
-0,5
-0,4
-0,3
-0,2
-0,1
0,0
0,1
0,2
0,3
0,4
0,5

V
X
UDS
CDS
Ghia
(b) Velocidade V no Centro da Cavidade
Figura 12: Reynolds 1000
4 Concluso
O CDS novamente apresentou melhores resultados que o UDS, embora utilizando UDS
chegava-se a convergncia com maior facilidade. medida que aumentava-se o nmero
de Reynolds o algoritmo tinha mais diculdade em alcanar a convergncia. Uma possvel
soluo seria renar mais a malha, porm sem o mtodo multigrid a soluo do sistema
era muito lenta devido ao elevado nmero de equaes. Apenas para ilustrar a situao,
quando tentou-se resolver uma malha 80x80 o computador chegava a alocar mais de 5 GB
de memria RAM. Apesar da diculdade de resolver para altos valores de Reynolds, os
resultados obtidos para at 1000 com CDS foram bons.
5 Bibliograa
PATANKAR, Suhas V. Numerical heat transfer and uid ow. New York: Mc Graw Hill,
1980. 197 p. (Series in computational methods in mechanics and thermal sciences )
MALISKA, Clovis Raimundo. Transferncia de calor e mecnica dos uidos computacional.
2. ed. rev. e ampl. Rio de Janeiro: LTC, 2010. xv, 453 p.
GHIA U., GHIA K.N., SHIN C.T. High-Re Solutions for Incompressible Flow Using the
Navier-Stokes Equations and a Multigrid Method. J. Comp. Phys., 48:387-411. 1982.
6 Anexo
1 // I ncl udes MTL
# i ncl ude " mtl/mat ri x . h"
3 # i ncl ude " mtl/compressed2D . h"
# i ncl ude " mtl/dense1D . h"
13
5 # i ncl ude " mtl/mtl . h"
# i ncl ude " mtl/ut i l s . h"
7 # i ncl ude " mtl/l u . h"
9 // I ncl udes ITL
# i ncl ude " i t l /i nt e r f a c e /mtl . h"
11 # i ncl ude " i t l /pr econdi t i oner /ssor . h"
# i ncl ude " i t l /pr econdi t i oner /i l u . h"
13 # i ncl ude " i t l /kryl ov/gmres . h"
# i ncl ude " i t l /kryl ov/bi cgs t ab . h"
15 # i ncl ude " i t l /pr econdi t i oner /i l ut . h"
# i ncl ude " i t l /kryl ov/qmr . h"
17 # i ncl ude " i t l / i t l . h"
19 //i ncl ude STD
# i ncl ude <i ostream>
21 # i ncl ude <cmath>
# i ncl ude <c s t dl i b >
23 # i ncl ude <fstream>
# i ncl ude <iomanip>
25
usi ng namespace st d ;
27
t ypedef mtl : : matrix < double , mtl : : r ect angl e <>, mtl : : array <mtl : : compressed<>>, mtl : : row_major >: :
type Matri x ;
29 t ypedef mtl : : dense1D<double> Vect or ;
31 //malha da pressao
i nt get PressureEast Nb ( i nt i , i nt volumes_x ) {
33 ret urn ( i +1) ; }
35 i nt getPressureWestNb ( i nt i , i nt volumes_x ) {
ret urn ( i 1) ; }
37
i nt getPressureNorthNb ( i nt i , i nt volumes_x ) {
39 ret urn ( i +volumes_x ) ; }
41 i nt getPressureSouthNb ( i nt i , i nt volumes_x ) {
ret urn ( i volumes_x ) ; }
43
i nt getU_PressureWest ( i nt i , i nt volumes_x ) {
45 ret urn i % volumes_x + ( ( i i % volumes_x ) / volumes_x )
*
( volumes_x + 1 ) ; }
47 i nt get U_PressureEast ( i nt i , i nt volumes_x ) {
ret urn getU_PressureWest ( i , volumes_x ) + 1 ; }
49
i nt getV_PressureSouth ( i nt i , i nt volumes_x ) {
51 ret urn i ; }
53 i nt getV_PressureNorth ( i nt i , i nt volumes_x ) {
ret urn getV_PressureSouth ( i , volumes_x ) + volumes_x ; }
55
//malha da vel oci dade U
57 i nt getUEastNb ( i nt i , i nt volumes_x ) {
ret urn i + 1 ; }
59
i nt getUWestNb( i nt i , i nt volumes_x ) {
61 ret urn i 1 ; }
63 i nt getUNorthNb ( i nt i , i nt volumes_x ) {
ret urn i + volumes_x + 1 ; }
65
i nt getUSouthNb ( i nt i , i nt volumes_x ) {
14
67 ret urn i volumes_x 1 ; }
69 i nt getPressureWest_U( i nt i , i nt volumes_x ) {
volumes_x++;
71 ret urn ( i % volumes_x 1 ) + ( ( i i % volumes_x ) / volumes_x )
*
( volumes_x 1 ) ; }
73 i nt get PressureEast _U ( i nt i , i nt volumes_x ) {
ret urn getPressureWest_U ( i , volumes_x ) + 1 ; }
75
i nt getVSW_U( i nt i , i nt volumes_x ) {
77 ret urn getPressureWest_U ( i , volumes_x ) ; }
79 i nt getVSE_U( i nt i , i nt volumes_x ) {
ret urn get PressureEast _U ( i , volumes_x ) ; }
81
i nt getVNW_U( i nt i , i nt volumes_x ) {
83 ret urn getVSW_U( i , volumes_x ) + volumes_x ; }
85 i nt getVNE_U( i nt i , i nt volumes_x ) {
ret urn getVSE_U( i , volumes_x ) + volumes_x ; }
87
//malha da vel oci dade V
89 i nt getVNorthNb ( i nt i , i nt volumes_x ) {
ret urn i + volumes_x ; }
91
i nt getVSouthNb ( i nt i , i nt volumes_x ) {
93 ret urn i volumes_x ; }
95 i nt getUNW_V( i nt i , i nt volumes_x ) {
ret urn ( i % volumes_x ) + ( ( i ( i % volumes_x ) ) /volumes_x )
*
( volumes_x + 1 ) ; }
97
i nt getUNE_V( i nt i , i nt volumes_x ) {
99 ret urn getUNW_V( i , volumes_x ) + 1 ; }
101 i nt getUSW_V( i nt i , i nt volumes_x ) {
ret urn getUNW_V( i , volumes_x ) volumes_x 1 ; }
103
i nt getUSE_V( i nt i , i nt volumes_x ) {
105 ret urn getUSW_V( i , volumes_x ) + 1 ; }
107 i nt getPressureNorth_V ( i nt i , i nt volumes_x ) {
ret urn i ; }
109
i nt getPressureSouth_V ( i nt i , i nt volumes_x ) {
111 ret urn i volumes_x ; }
113 double i nfi ni t y_Norm ( Vect or & T_old , Vect or & T, i nt s i ze ) {
double max = 0 . 0 ;
115 f or ( i nt i = 0; i < s i ze ; i ++ ) {
i f ( f abs ( ( T_old [ i ]T[ i ] ) ) > max )
117 max = f abs ( ( T_old [ i ]T[ i ] ) ) ; }
ret urn max ; }
119
i nt getWestFaceID( i nt yIndex , i nt si ze_x ) {
121 i nt i = yIndex % si ze_x ;
i nt j = ( yIndex i ) /si ze_x ;
123 ret urn i + j
*
( s i ze_x + 1 ) ; }
125 i nt get East FaceI D ( i nt yIndex , i nt si ze_x ) {
ret urn getWestFaceID( yIndex , si ze_x ) + 1 ; }
127
void computeStreamLines ( Vect or& streamLi nes , Vect or sol ut i on , i nt v_of f s et , i nt si ze_x , i nt si ze_y
, double dx ) {
15
129 f or ( i nt index = 0 ; index < ( si ze_y +1)
*
( s i ze_x ) ; ++index ) {
st reamLi nes [ get East FaceI D ( index , si ze_x ) ] = st reamLi nes [ getWestFaceID( index , si ze_x ) ] +
131 s ol ut i on [ index + v_of f s e t ]
*
dx ; } }
133 i nt main ( )
{
135 i nt si ze_x , DT; double Re ; s t r i ng fi l ename , fi l ename2 , scheme ; st r i ngst r eam s , s1 ; const i nt W =
25;
cout << " Ent er t he scheme t o eval uat e t he pr oper t i es at t he f ac es (UDS, CDS) : " ;
137 ci n >> scheme ;
cout << " Ent er t he number of gri d poi nt s i n one di r e c t i on : " ;
139 ci n >> s i ze_x ;
cout << " Ent er t he Reynolds number : " ;
141 ci n >> Re ;
cout << " Dt by Courant Number ( 1 ) or very l ar ge ( 0 ) : " ;
143 ci n >> DT;
s << Re << " _ " << si ze_x << " dx" << scheme << " _PSI . dat " ;
145 f i l ename = s . s t r ( ) ;
of st ream oFi l e ( f i l ename . c _ s t r ( ) , i os : : out ) ;
147 s1 << Re << " _ " << si ze_x << " dx" << scheme << " _SPE . dat " ;
f i l ename2 = s1 . s t r ( ) ;
149 of st ream oFi l e2 ( f i l ename2 . c _ s t r ( ) , i os : : out ) ;
151 double erro = 1 , i nt e r nal _e r r o = 1 , i nt er nal _s t op = 1E5, st op = 1E5, er r o_ant er i or , dt_ol d ,
time = 0;
double dx , dy , flow_e , flow_w , flow_n , fl ow_s ;
153 double De , Dw, Dn, Ds , ap_old ;
double ae , an , as , aw, gamma_y, gamma_x ;
155 double rho = 1 , l = 1 , L = 1 , mi = 1/Re , v_pl aca = 1 ;
i nt si ze_y = si ze_x , s i ze = si ze_x
*
si ze_y + ( si ze_x +1)
*
si ze_y + si ze_x
*
( si ze_y +1) ;
157 i nt v_of f s e t = ( si ze_x +1)
*
si ze_y , j = 0 , t i me_i t er = 0;
i nt p_of f s et = ( si ze_x +1)
*
si ze_y
*
2 ;
159 dx = dy = L/si ze_x ;
161 double dt ;
i f ( DT == 0 )
163 dt = 1000;
e l s e
165 dt = dt _ol d = 0 . 8
*
dx ;
167 Matri x A( si ze , s i ze ) ;
Vect or b( s i ze ) , b_old ( s i ze ) , ext er nal _s ol ut i on ( s i ze ) , ol d_ext er nal _s ol ut i on ( s i ze ) , s ol ut i on ( s i ze )
, ol d_sol ut i on ( s i ze ) , c ( s i ze ) ;
169
f or ( i nt i = 0; i < s i ze ; i ++ )
171 b_old [ i ] = s ol ut i on [ i ] = ol d_sol ut i on [ i ] = ol d_ext er nal _s ol ut i on [ i ] = 0 ;
173 De = Dw = mi
*
dy
*
l /dx ;
Dn = Ds = mi
*
dx
*
l /dy ;
175
do{
177 ap_old = rho
*
l
*
dx
*
dy/dt ;
f or ( i nt i = 0 ; i < ( si ze_x +1)
*
si ze_y ; i ++ ) {
179 b[ i ] = ol d_ext er nal _s ol ut i on [ i ]
*
ap_old ;
i f ( ( i >= ( ( si ze_x +1)
*
si ze_y ( si ze_x + 1 1) ) ) && i < ( ( si ze_x +1)
*
si ze_y 1) ) //north
181 b[ i ] += v_pl aca
*
mi
*
dx
*
l
*
2/dy ; }
f or ( i nt i = 0 ; i < si ze_x
*
( si ze_y +1) ; i ++ ) {
183 b[ i +v_of f s e t ] = ol d_ext er nal _s ol ut i on [ i +v_of f s e t ]
*
ap_old ; }
f or ( i nt i = 0 ; i < si ze_x
*
si ze_y ; i ++ ) {
185 b[ i +p_of f s et ] = 0 ; }
187 do{
//malha de U
16
189 f or ( i nt i = 0 ; i < ( si ze_x +1)
*
si ze_y ; i ++ ) {
j = i /( si ze_x +1) ;
191 //volumes i nt er nos
i f ( ( i > ( j
*
( s i ze_x +1) ) ) && i < ( ( ( j +1)
*
( s i ze_x +1) ) 1) && j ! = 0 && j ! = ( si ze_y 1) ) {
193 gamma_x = rho
*
dy
*
l /2;
gamma_y = rho
*
dx
*
l /2;
195 fl ow_e = ( s ol ut i on [ getUEastNb ( i , si ze_x ) ]+ s ol ut i on [ i ] )
*
gamma_x ;
flow_w = ( s ol ut i on [ getUWestNb( i , si ze_x ) ]+ s ol ut i on [ i ] )
*
gamma_x ;
197 flow_n = ( s ol ut i on [ getVNE_U( i , si ze_x ) +v_of f s e t ]+ s ol ut i on [getVNW_U( i , si ze_x ) +v_of f s et ] )
*
gamma_y;
fl ow_s = ( s ol ut i on [ getVSE_U( i , s i ze_x ) +v_of f s e t ]+ s ol ut i on [ getVSW_U( i , si ze_x ) +v_of f s e t ] )
*
gamma_y;
199 i f ( scheme == "CDS" ) {
ae = De fl ow_e /2;
201 aw = Dw + flow_w/2;
an = Dn flow_n /2;
203 as = Ds + fl ow_s /2; }
i f ( scheme == "UDS" ) {
205 i f ( fl ow_e >= 0 ) {
ae = De ;
207 aw = Dw + flow_w ; }
e l s e {
209 ae = De fl ow_e ;
aw = Dw; }
211 i f ( flow_n >= 0 ) {
an = Dn;
213 as = Ds + fl ow_s ; }
e l s e {
215 an = Dn flow_n ; ;
as = Ds ; } }
217 A( i , i ) = ae + aw + an + as + ap_old ;
A( i , i +1) = ae ;
219 A( i , i 1) = aw;
A( i , getUNorthNb ( i , si ze_x ) ) = an ;
221 A( i , getUSouthNb ( i , si ze_x ) ) = as ;
A( i , get PressureEast _U ( i , si ze_x ) +p_of f s et ) = dy
*
l ;
223 A( i , getPressureWest_U ( i , si ze_x ) +p_of f s et ) = dy
*
l ; }
//volumes sul
225 i f ( i ! = 0 && i < ( si ze_x +11) ) {
gamma_x = rho
*
dy
*
l /2;
227 gamma_y = rho
*
dx
*
l /2;
fl ow_e = ( s ol ut i on [ getUEastNb ( i , si ze_x ) ]+ s ol ut i on [ i ] )
*
gamma_x ;
229 flow_w = ( s ol ut i on [ getUWestNb( i , si ze_x ) ]+ s ol ut i on [ i ] )
*
gamma_x ;
flow_n = ( s ol ut i on [ getVNE_U( i , si ze_x ) +v_of f s e t ]+ s ol ut i on [getVNW_U( i , si ze_x ) +v_of f s et ] )
*
gamma_y;
231 i f ( scheme == "CDS" ) {
ae = De fl ow_e /2;
233 aw = Dw + flow_w/2;
an = Dn flow_n /2;
235 as = 2
*
Ds ; }
i f ( scheme == "UDS" ) {
237 i f ( fl ow_e >= 0 ) {
ae = De ;
239 aw = Dw + flow_w ; }
e l s e {
241 ae = De fl ow_e ; ;
aw = Dw; }
243 i f ( flow_n >= 0 ) {
an = Dn;
245 as = Ds
*
2 ; }
e l s e {
247 an = Dn flow_n ; ;
as = 2
*
Ds ; } }
17
249 A( i , i ) = ae + aw + an + as + ap_old ;
A( i , i +1) = ae ;
251 A( i , i 1) = aw;
A( i , getUNorthNb ( i , si ze_x ) ) = an ;
253 A( i , get PressureEast _U ( i , si ze_x ) +p_of f s et ) = dy
*
l ;
A( i , getPressureWest_U ( i , si ze_x ) +p_of f s et ) = dy
*
l ; }
255 //volumes nort e
i f ( ( i >= ( ( si ze_x +1)
*
si ze_y ( si ze_x + 1 1) ) ) && i < ( ( si ze_x +1)
*
si ze_y 1) ) {
257 gamma_x = rho
*
dy
*
l /2;
gamma_y = rho
*
dx
*
l /2;
259 fl ow_e = ( s ol ut i on [ getUEastNb ( i , si ze_x ) ]+ s ol ut i on [ i ] )
*
gamma_x ;
flow_w = ( s ol ut i on [ getUWestNb( i , si ze_x ) ]+ s ol ut i on [ i ] )
*
gamma_x ;
261 fl ow_s = ( s ol ut i on [ getVSE_U( i , s i ze_x ) +v_of f s e t ]+ s ol ut i on [ getVSW_U( i , si ze_x ) +v_of f s e t ] )
*
gamma_y;
i f ( scheme == "CDS" ) {
263 ae = De fl ow_e /2;
aw = Dw + flow_w/2;
265 an = 2
*
Dn;
as = Ds + fl ow_s /2; }
267 i f ( scheme == "UDS" ) {
i f ( fl ow_e >= 0 ) {
269 ae = De ;
aw = Dw + flow_w ; }
271 e l s e {
ae = De fl ow_e ; ;
273 aw = Dw; }
i f ( flow_n >= 0 ) {
275 an = 2
*
Dn;
as = Ds + fl ow_s ; }
277 e l s e {
an = Dn
*
2 ;
279 as = Ds ; } }
A( i , i ) = ae + aw + an + as + ap_old ;
281 A( i , i +1) = ae ;
A( i , i 1) = aw;
283 A( i , getUSouthNb ( i , si ze_x ) ) = as ;
A( i , get PressureEast _U ( i , si ze_x ) +p_of f s et ) = dy
*
l ;
285 A( i , getPressureWest_U ( i , si ze_x ) +p_of f s et ) = dy
*
l ; }
//volumes west
287 i f ( ( ( i % ( si ze_x +1 ) ) == 0) && ( i > 0) && ( i < ( ( si ze_x +1)
*
si ze_y ( si ze_x +11) ) ) && i
! = 0 && j ! = ( si ze_y 1) ) {
A( i , i ) = 1 ; }
289 //volumes eas t
i f ( ( ( i % ( ( si ze_x +1)
*
( j +1) 1 ) ) == 0) && i ! = ( si ze_x + 1 1) && i ! = ( ( si ze_x +1)
*
si ze_y 1) && i ! = 0) {
291 A( i , i ) = 1 ; }
//volumes NorthEast
293 i f ( i == ( ( si ze_x +1)
*
si ze_y 1) ) {A( i , i ) = 1 ; }
//volumes NorthWest
295 i f ( i == ( ( si ze_x +1)
*
si ze_y ( si ze_x + 1) ) ) {A( i , i ) = 1 ; }
//volumes SouthEast
297 i f ( i == ( si ze_x + 1 1 ) ) {A( i , i ) = 1 ; }
//volumes SouthWest
299 i f ( i == 0 ) {A( i , i ) = 1 ; } }
//malha de V
301 f or ( i nt i = 0 ; i < si ze_x
*
( si ze_y +1) ; i ++ ) {
j = i /si ze_x ;
303 //volumes i nt er nos
i f ( ( i > ( j
*
si ze_x ) ) && i < ( ( ( j +1)
*
si ze_x ) 1) && j ! = 0 && j ! = ( si ze_y + 1 1) ) {
305 gamma_x = rho
*
dy
*
l /2;
gamma_y = rho
*
dx
*
l /2;
307 fl ow_e = ( s ol ut i on [ getUNE_V( i , si ze_x ) ]+ s ol ut i on [ getUSE_V( i , s i ze_x ) ] )
*
gamma_x ;
flow_w = ( s ol ut i on [getUNW_V( i , si ze_x ) ]+ s ol ut i on [ getUSW_V( i , si ze_x ) ] )
*
gamma_x ;
18
309 flow_n = ( s ol ut i on [ getVNorthNb ( i , si ze_x ) +v_of f s e t ]+ s ol ut i on [ i +v_of f s e t ] )
*
gamma_y;
fl ow_s = ( s ol ut i on [ getVSouthNb ( i , s i ze_x ) +v_of f s e t ]+ s ol ut i on [ i +v_of f s e t ] )
*
gamma_y;
311 i f ( scheme == "CDS" ) {
ae = De fl ow_e /2;
313 aw = Dw + flow_w/2;
an = Dn flow_n /2;
315 as = Ds + fl ow_s /2; }
i f ( scheme == "UDS" ) {
317 i f ( fl ow_e >= 0 ) {
ae = De ;
319 aw = Dw + flow_w ; }
e l s e {
321 ae = De fl ow_e ; ;
aw = Dw; }
323 i f ( flow_n >= 0 ) {
an = Dn;
325 as = Ds + fl ow_s ; }
e l s e {
327 an = Dn flow_n ;
as = Ds ; } }
329 A( i +v_of f s et , i +v_of f s et ) = ae + aw + an + as + ap_old ;
A( i +v_of f s et , i +v_of f s et +1) = ae ;
331 A( i +v_of f s et , i +v_of f s et 1) = aw;
A( i +v_of f s et , getVNorthNb ( i , si ze_x ) +v_of f s e t ) = an ;
333 A( i +v_of f s et , getVSouthNb ( i , si ze_x ) +v_of f s e t ) = as ;
A( i +v_of f s et , getPressureNorth_V ( i , s i ze_x ) +p_of f s et ) = dx
*
l ;
335 A( i +v_of f s et , getPressureSouth_V ( i , s i ze_x ) +p_of f s et ) = dx
*
l ; }
//volumes sul
337 i f ( i ! = 0 && i < ( si ze_x 1) ) {A( i +v_of f s et , i +v_of f s et ) = 1 ; }
//volumes nort e
339 i f ( ( i >= ( si ze_x
*
( si ze_y +1) ( si ze_x 1) ) ) && i < ( si ze_x
*
( si ze_y +1) 1) ) {
A( i +v_of f s et , i +v_of f s et ) = 1 ; }
341 //volumes west
i f ( ( ( i % ( si ze_x ) ) == 0) && ( i > 0) && ( i < ( si ze_x
*
( si ze_y +1) ( si ze_x 1) ) ) && i ! = 0
&& j ! = ( si ze_y + 1 1) ) {
343 gamma_x = rho
*
dy
*
l /2;
gamma_y = rho
*
dx
*
l /2;
345 fl ow_e = ( s ol ut i on [ getUNE_V( i , si ze_x ) ]+ s ol ut i on [ getUSE_V( i , s i ze_x ) ] )
*
gamma_x ;
flow_n = ( s ol ut i on [ getVNorthNb ( i , si ze_x ) +v_of f s e t ]+ s ol ut i on [ i +v_of f s e t ] )
*
gamma_y;
347 fl ow_s = ( s ol ut i on [ getVSouthNb ( i , s i ze_x ) +v_of f s e t ]+ s ol ut i on [ i +v_of f s e t ] )
*
gamma_y;
i f ( scheme == "CDS" ) {
349 ae = De fl ow_e /2;
aw = 2
*
Dw;
351 an = Dn flow_n /2;
as = Ds + fl ow_s /2; }
353 i f ( scheme == "UDS" ) {
i f ( fl ow_e >= 0 ) {
355 ae = De ;
aw = Dw
*
2 ; }
357 e l s e {
ae = De fl ow_e ; ;
359 aw = 2
*
Dw; }
i f ( flow_n >= 0 ) {
361 an = Dn;
as = Ds + fl ow_s ; }
363 e l s e {
an = Dn flow_n ;
365 as = Ds ; } }
A( i +v_of f s et , i +v_of f s et ) = ae + aw + an + as + ap_old ;
367 A( i +v_of f s et , i +v_of f s et +1) = ae ;
A( i +v_of f s et , getVNorthNb ( i , si ze_x ) +v_of f s e t ) = an ;
369 A( i +v_of f s et , getVSouthNb ( i , si ze_x ) +v_of f s e t ) = as ;
A( i +v_of f s et , getPressureNorth_V ( i , s i ze_x ) +p_of f s et ) = dx
*
l ;
19
371 A( i +v_of f s et , getPressureSouth_V ( i , s i ze_x ) +p_of f s et ) = dx
*
l ; }
//volumes eas t
373 i f ( ( ( i % ( ( si ze_x )
*
( j +1) 1 ) ) == 0) && i ! = ( si ze_x 1) && i ! = ( si ze_x
*
( si ze_y +1)
1) && i ! = 0) {
gamma_x = rho
*
dy
*
l /2;
375 gamma_y = rho
*
dx
*
l /2;
flow_w = ( s ol ut i on [getUNW_V( i , si ze_x ) ]+ s ol ut i on [ getUSW_V( i , si ze_x ) ] )
*
gamma_x ;
377 flow_n = ( s ol ut i on [ getVNorthNb ( i , si ze_x ) +v_of f s e t ]+ s ol ut i on [ i +v_of f s e t ] )
*
gamma_y;
fl ow_s = ( s ol ut i on [ getVSouthNb ( i , s i ze_x ) +v_of f s e t ]+ s ol ut i on [ i +v_of f s e t ] )
*
gamma_y;
379 i f ( scheme == "CDS" ) {
ae = 2
*
De ;
381 aw = Dw + flow_w/2;
an = Dn flow_n /2;
383 as = Ds + fl ow_s /2; }
i f ( scheme == "UDS" ) {
385 i f ( fl ow_e >= 0 ) {
ae = De
*
2 ;
387 aw = Dw + flow_w ; }
e l s e {
389 ae = De
*
2 ;
aw = Dw; }
391 i f ( flow_n >= 0 ) {
an = Dn;
393 as = Ds + fl ow_s ; }
e l s e {
395 an = Dn flow_n ;
as = Ds ; } }
397 A( i +v_of f s et , i +v_of f s et ) = ae + aw + an + as + ap_old ;
A( i +v_of f s et , i +v_of f s et 1) = aw;
399 A( i +v_of f s et , getVNorthNb ( i , si ze_x ) +v_of f s e t ) = an ;
A( i +v_of f s et , getVSouthNb ( i , si ze_x ) +v_of f s e t ) = as ;
401 A( i +v_of f s et , getPressureNorth_V ( i , s i ze_x ) +p_of f s et ) = dx
*
l ;
A( i +v_of f s et , getPressureSouth_V ( i , s i ze_x ) +p_of f s et ) = dx
*
l ; }
403 //volumes NorthEast
i f ( i == ( si ze_x
*
( si ze_y +1) 1) ) {
405 A( i +v_of f s et , i +v_of f s et ) = 1 ; }
//volumes NorthWest
407 i f ( i == ( si ze_x
*
( si ze_y +1) ( si ze_x ) ) ) {
A( i +v_of f s et , i +v_of f s et ) = 1 ; }
409 //volumes SouthEast
i f ( i == ( si ze_x 1 ) ) {
411 A( i +v_of f s et , i +v_of f s et ) = 1 ; }
//volumes SouthWest
413 i f ( i == 0 ) {
A( i +v_of f s et , i +v_of f s et ) = 1 ; } }
415 //malha de P
f or ( i nt i = 0 ; i < si ze_x
*
si ze_y ; i ++ ) {
417 gamma_x = dy
*
l ;
gamma_y = dx
*
l ;
419 fl ow_e = gamma_x ;
flow_w = gamma_x ;
421 flow_n = gamma_y;
fl ow_s = gamma_y;
423 ae = fl ow_e ;
aw = flow_w;
425 an = flow_n ;
as = fl ow_s ;
427 j = i /si ze_x ;
//volumes i nt er nos
429 i f ( ( i > ( j
*
si ze_x ) ) && i < ( ( ( j +1)
*
si ze_x ) 1) && j ! = 0 && j ! = ( si ze_y 1) ) {
A( i +p_of f set , get U_PressureEast ( i , s i ze_x ) ) = ae ;
431 A( i +p_of f set , getU_PressureWest ( i , s i ze_x ) ) = aw;
A( i +p_of f set , i +v_of f s et +si ze_x ) = an ;
20
433 A( i +p_of f set , i +v_of f s et ) = as ; }
//volumes sul
435 i f ( i ! = 0 && i < ( si ze_x 1) ) {
A( i +p_of f set , get U_PressureEast ( i , s i ze_x ) ) = ae ;
437 A( i +p_of f set , getU_PressureWest ( i , s i ze_x ) ) = aw;
A( i +p_of f set , i +v_of f s et +si ze_x ) = an ;
439 A( i +p_of f set , i +v_of f s et ) = as ; }
//volumes nort e
441 i f ( ( i >= ( si ze_x
*
si ze_y ( si ze_x 1) ) ) && i < ( si ze_x
*
si ze_y 1) ) {
A( i +p_of f set , get U_PressureEast ( i , s i ze_x ) ) = ae ;
443 A( i +p_of f set , getU_PressureWest ( i , s i ze_x ) ) = aw;
A( i +p_of f set , i +v_of f s et +si ze_x ) = an ;
445 A( i +p_of f set , i +v_of f s et ) = as ; }
//volumes west
447 i f ( ( ( i % ( si ze_x ) ) == 0) && ( i > 0) && ( i < ( s i ze_x
*
si ze_y ( si ze_x 1) ) ) && i ! = 0 &&
j ! = ( si ze_y 1) ) {
A( i +p_of f set , get U_PressureEast ( i , s i ze_x ) ) = ae ;
449 A( i +p_of f set , getU_PressureWest ( i , s i ze_x ) ) = aw;
A( i +p_of f set , i +v_of f s et +si ze_x ) = an ;
451 A( i +p_of f set , i +v_of f s et ) = as ; }
//volumes eas t
453 i f ( ( ( i % ( ( si ze_x )
*
( j +1) 1 ) ) == 0) && i ! = ( si ze_x 1) && i ! = ( si ze_x
*
si ze_y 1)
&& i ! = 0) {
A( i +p_of f set , get U_PressureEast ( i , s i ze_x ) ) = ae ;
455 A( i +p_of f set , getU_PressureWest ( i , s i ze_x ) ) = aw;
A( i +p_of f set , i +v_of f s et +si ze_x ) = an ;
457 A( i +p_of f set , i +v_of f s et ) = as ; }
//volumes NorthEast
459 i f ( i == ( si ze_x
*
si ze_y 1) ) {
/
*
A( i +p_of f set , i +p_of f s et ) = 1;
*
/
461 A( i +p_of f set , get U_PressureEast ( i , s i ze_x ) ) = ae ;
A( i +p_of f set , getU_PressureWest ( i , s i ze_x ) ) = aw;
463 A( i +p_of f set , i +v_of f s et +si ze_x ) = an ;
A( i +p_of f set , i +v_of f s et ) = as ; }
465 //volumes NorthWest
i f ( i == ( si ze_x
*
si ze_y ( si ze_x ) ) ) {
467 A( i +p_of f set , get U_PressureEast ( i , s i ze_x ) ) = ae ;
A( i +p_of f set , getU_PressureWest ( i , s i ze_x ) ) = aw;
469 A( i +p_of f set , i +v_of f s et +si ze_x ) = an ;
A( i +p_of f set , i +v_of f s et ) = as ; }
471 //volumes SouthEast
i f ( i == ( si ze_x 1 ) ) {
473 A( i +p_of f set , get U_PressureEast ( i , s i ze_x ) ) = ae ;
A( i +p_of f set , getU_PressureWest ( i , s i ze_x ) ) = aw;
475 A( i +p_of f set , i +v_of f s et +si ze_x ) = an ;
A( i +p_of f set , i +v_of f s et ) = as ; }
477 //volumes SouthWest
i f ( i == 0 ) {
479 A( i +p_of f set , i +p_of f s et ) = 1 ; } }
481 i nt r e s t a r t = s i ze ;
i nt max_i t er = 1000000;
483 i t l : : SSOR< Matri x > precond (A) ;
i t l : : sol ve ( precond ( ) , b , c ) ;
485 i t l : : noi s y_i t er at i on < double > i t e r ( c , max_i ter , 0. 0 , 1E7 ) ;
i t l : : modified_gram_schmidt < Vect or > ort h ( r e s t a r t , s i ze ) ;
487 i t l : : gmres ( A, sol ut i on , b , precond ( ) , r e s t a r t , i t e r , ort h ) ;
mtl : : pr i nt _al l _mat r i x (A) ;
489 mtl : : pr i nt _vec t or ( s ol ut i on ) ;
mtl : : pr i nt _vec t or ( b) ;
491 system( "PAUSE" ) ;
er r o_ant er i or = i nt e r nal _e r r o ;
493 i nt e r nal _e r r o = i nfi ni t y_Norm ( ol d_sol ut i on , sol ut i on , s i ze ) ;
21
f or ( i nt i = 0 ; i < s i ze ; i ++) {
495 ol d_sol ut i on [ i ] = s ol ut i on [ i ] ; }
cout << " i nt e r nal : " << i nt e r nal _e r r o << endl ;
497 } while ( i nt e r nal _e r r o >= i nt er nal _s t op ) ;
499 f or ( i nt i = 0 ; i < s i ze ; i ++)
ext er nal _s ol ut i on [ i ] = s ol ut i on [ i ] ;
501
i nt r e s t a r t = s i ze ;
503 i nt max_i t er = 1000000;
i t l : : SSOR< Matri x > precond2 (A) ;
505 i t l : : sol ve ( precond2 ( ) , b , c ) ;
i t l : : noi s y_i t er at i on < double > i t e r 2 ( c , max_i ter , 0 . 0 , 1E6 ) ;
507 i t l : : modified_gram_schmidt < Vect or > ort h2 ( r e s t a r t , s i ze ) ;
i t l : : gmres ( A, ext er nal _s ol ut i on , b , precond2 ( ) , r e s t a r t , i t e r 2 , ort h2 ) ;
509 mtl : : pr i nt _al l _mat r i x (A) ;
mtl : : pr i nt _vec t or ( s ol ut i on ) ;
511 mtl : : pr i nt _vec t or ( b) ;
system( "PAUSE" ) ;
513
erro = i nfi ni t y_Norm ( ol d_ext er nal _s ol ut i on , ext er nal _s ol ut i on , s i ze ) ;
515 f or ( i nt i = 0 ; i < s i ze ; i ++)
ol d_ext er nal _s ol ut i on [ i ] = ext er nal _s ol ut i on [ i ] ;
517
cout << " ext er nal : " << erro << endl ;
519 time += dt ;
// cout << f i xed << setw( 10) << s e t pr e c i s i on ( 8 ) << dt << "\t <\t "
521 // << ( er r o_ant er i or
*
dt _ol d ) /erro << "\t <\t " << er r o_ant er i or /( erro/dt ) << endl ;
// i f ( DT == 1 ) {
523 // dt _ol d = dt ;
// i f ( er r o_ant er i or /( erro/dt ) <= 1. 1 && er r o_ant er i or /( erro/dt ) >= 1)
525 // //dt
*
= 1 . 0 5 ;
// i f ( er r o_ant er i or /( erro/dt ) < 0. 97 )
527 // dt /= 1 . 0 5 ; }
} while ( erro >= st op ) ;
529
//Tecpl ot Export er
531 i nt count er = 0 ;
Vect or st reamLi nes ( s i ze ) ;
533 computeStreamLines ( streamLi nes , sol ut i on , v_of f s et , si ze_x , si ze_y , dx ) ;
535 oFi l e << " Var i abl es = \" x \" , \"y\" , \" Pressure \" , \" Psi \" " << endl ;
oFi l e << " Zone , i = " << si ze_x + 1 << " , j = " << si ze_y + 1 << " , " ;
537 oFi l e << " Datapacking = BLOCK, Var l ocat i on = ( [ 3 ] = Cel l Cent ered ) " << endl << endl ;
double xPosi t i on = 0 . 0 ;
539 double yPosi t i on ;
f or ( i nt j = 0; j < si ze_y + 1 ; ++j ) {
541 xPos i t i on = 0 ;
f or ( i nt i = 0 ; i < si ze_x + 1; ++i ) {
543 i f ( count er == 10 ) {
oFi l e << endl ;
545 count er = 0 ; }
oFi l e << s c i e n t i f i c << s e t pr e c i s i on ( 5 ) << xPos i t i on << " " ;
547 xPos i t i on += dx ;
count er ++; } }
549
oFi l e << endl << endl ;
551 count er = 0;
yPosi t i on = 0 ;
553 f or ( i nt j = 0; j < si ze_y + 1 ; j ++ ) {
f or ( i nt i = 0 ; i < si ze_x + 1; i ++ ) {
555 i f ( count er == 10 ) {
oFi l e << endl ;
22
557 count er = 0 ; }
oFi l e << s c i e n t i f i c << s e t pr e c i s i on ( 5 ) << yPosi t i on << " " ;
559 count er ++; }
yPosi t i on += dy ; }
561
oFi l e << endl << endl ;
563 count er = 0;
f or ( i nt index = 0 ; index < si ze_x
*
si ze_y ; ++index ) {
565 i f ( count er == 10 ) {
oFi l e << endl ;
567 count er = 0 ; }
oFi l e << s c i e n t i f i c << s e t pr e c i s i on ( 5 ) << s ol ut i on [ index + p_of f s et ] << " " ;
569 count er ++; }
571 oFi l e << endl << endl ;
count er = 0 ;
573 f or ( i nt index = 0 ; index < ( si ze_x +1)
*
( si ze_y +1) ; index++ ) {
i f ( count er == 10 ) {
575 oFi l e << endl ;
count er = 0 ; }
577 oFi l e << s c i e n t i f i c << s e t pr e c i s i on ( 5 ) << st reamLi nes [ index ] << " " ;
count er ++; }
579
yPosi t i on = dy/2;
581 xPos i t i on = dx/2;
oFi l e2 << "U VELOCITY" << endl ;
583 f or ( i nt i = si ze_x /2+1; i < ( si ze_x +1)
*
si ze_y ; i += ( si ze_x + 1) ) {
oFi l e2 << s c i e n t i f i c << s e t pr e c i s i on ( 5 ) << yPosi t i on << " \t " << s ol ut i on [ i ] << endl ;
585 yPosi t i on += dy ; }
oFi l e2 << endl << "V VELOCITY" << endl ;
587 f or ( i nt i = si ze_x
*
( si ze_y /2) ; i < si ze_x
*
( si ze_y /2+1) ; i ++ ) {
oFi l e2 << s c i e n t i f i c << s e t pr e c i s i on ( 5 ) << xPosi t i on << " \t " << s ol ut i on [ i +v_of f s e t ] << endl
;
589 xPos i t i on += dx ; }
591 system( "PAUSE" ) ; }
trabalho_10.cpp
23

Você também pode gostar