Documente Academic
Documente Profesional
Documente Cultură
1
Ax i =
(xi − xi−1 )(∆xi )
1
C xi =
(xi+1 − xi )(∆xi ) (4)
Bxi = Axi + Cxi
xi+1 − xi+1
∆xi =
2
n
e Ci,j a correção efetuada no potencial de velocidade.
Dado as equações 1 e 2, estas são resolvidas utilizando 5 esquemas de iterações diferentes. A seguir seguem
os esquiços da solução numérica adotados no programa,
Os operadores N associados aos esquemas de solução utilizando a equação 2 empregados no programa serão
demonstrados a seguir.
1. Jacobi (ou point-Jacobi)
2 2
NP J = − 2
− (5)
∆x ∆y 2
n
Com a seguinte configuração no programa para solução da correção Ci,j do potencial de velocidades,
n Lφi,j
Ci,j = (6)
1 1
2 ∆xi 2
+ ∆yj 2
yj+1 − yj−1
∆yj = (7)
2
2. Gauss-Seidel (ou point-Gauss-Seidel)
1 1
Ex−1 − 2 + Ey−1 − 2
NP GS = (8)
∆x2 ∆y 2
n
Com a seguinte configuração no programa para solução da correção Ci,j do potencial de velocidades,
1 n
n
Ci,j = Lφi,j (∆xi ∆yj )2 +Ci−1,j
n
∆yj 2
2
1
(9)
n 2
+Ci,j−1 ∆xi
∆xi + ∆yj 2
2
1
Ex−1 − 2 + δ̃yy
NP LGS = 2
(12)
∆x
n
Com a seguinte configuração no programa para solução da correção Ci,j do potencial de velocidades,
n n n
AT j Ci,j−1 + BT j Ci,j + CT j Ci,j+1 = DT j (13)
AT j = Ayj
2
BT j = − Byj +
∆xi 2
(14)
CT j = Cyj
n
Ci−1,j
n
DT j = − Lφi,j +
∆xi 2
1
Ay j =
(yj − yj−1 )(∆yj )
1
Cyj =
(yj+1 − yj )(∆yj ) (15)
Byj = Ayj + Cyj
yj+1 − yj+1
∆yj =
2
AT j = Ay j
2
BT j = − Byj +
∆xi 2
(17)
CT j = Cyj
n
Ci−1,j
n
DT j = −r Lφi,j +
∆xi 2
2 Resultados
1. Problema: t = 0.05 e U∞ = 1.00
(a) Resíduo: log10 |Lφni,j |max = 1e − 5
Para a resolução do problema seguem os gráficos a seguir.
101 −0.15
NPJ Caso de Referência
NPGS NPJ
NSOR NPGS
NLGS NSOR
100 NSLOR NLGS
−0.10
NSLOR
10−1
−0.05
log10 |L Φi,jn|max
−2
10
−Cp
+0.00
10−3
+0.05
10−4
+0.10
10−5
10−6 +0.15
0 500 1000 1500 2000 2500 3000 3500 4000 0 0.2 0.4 0.6 0.8 1
Iteração x/c
2
1.5
1
y
0.5
−1
0 −2
−2 −1 0 1 2 3
x
102 −0.15
NPJ Caso de Referência
NPGS NPJ
NSOR NPGS
101 NLGS NSOR
NSLOR −0.10 NLGS
NSLOR
100
10−1 −0.05
log10 |L Φi,jn|max
10−2
−Cp
+0.00
10−3
10−4 +0.05
10−5
+0.10
−6
10
10−7 +0.15
0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 0 0.2 0.4 0.6 0.8 1
Iteração x/c
2
1.5
1
y
0.5
−1
0 −2
−2 −1 0 1 2 3
x
102 −0.15
NPJ Caso de Referência
NPGS NPJ
NSOR NPGS
100 NLGS NSOR
NSLOR −0.10 NLGS
NSLOR
10−2
−0.05
10−4
log10 |L Φi,jn|max
−Cp
10−6 +0.00
10−8
+0.05
−10
10
+0.10
10−12
10−14 +0.15
0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 0 0.2 0.4 0.6 0.8 1
Iteração x/c
2
1.5
1
y
0.5
−1
0 −2
−2 −1 0 1 2 3
x
102 −0.30
NPJ Caso de Referência
NPGS NPJ
NSOR NPGS
101 NLGS NSOR
NSLOR −0.20 NLGS
NSLOR
100
−0.10
10−1
log10 |L Φi,jn|max
−Cp
10−2 +0.00
10−3
+0.10
−4
10
+0.20
10−5
10−6 +0.30
0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 0 0.2 0.4 0.6 0.8 1
Iteração x/c
2
1.5
1
y
0.5
−1
0 −2
−2 −1 0 1 2 3
x
102 −0.30
NPJ Caso de Referência
NPGS NPJ
NSOR NPGS
101 NLGS NSOR
NSLOR −0.20 NLGS
NSLOR
100
10−1 −0.10
log10 |L Φi,jn|max
10−2
−Cp
+0.00
10−3
10−4 +0.10
10−5
+0.20
−6
10
10−7 +0.30
0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 0 0.2 0.4 0.6 0.8 1
Iteração x/c
2
1.5
1
y
0.5
−1
0 −2
−2 −1 0 1 2 3
x
102 −0.30
NPJ Caso de Referência
NPGS NPJ
NSOR NPGS
100 NLGS NSOR
NSLOR −0.20 NLGS
NSLOR
10−2
−0.10
10−4
log10 |L Φi,jn|max
−Cp
10−6 +0.00
10−8
+0.10
−10
10
+0.20
10−12
10−14 +0.30
0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 0 0.2 0.4 0.6 0.8 1
Iteração x/c
Figura 11: Resultados para t = 0.05 e U∞ = 1.00; rSOR = 1.98; rSLOR = 1.95
2
1.5
1
y
0.5
−1
0 −2
−2 −1 0 1 2 3
x
1. Foi observado que para a resolução do problema a escrita e forma de implementar a equação da solução,
implicam diretamente no número de iterações para resolver o problema, por exemplo, os métodos SOR,
LGS e SLOR mudavam no número de iterações quando escritos de formas diferentes;
2. A ordem e estruturação dentro do laço do processo iterativo implica diretamente no resultado e consequen-
temente o resíduo, por exemplo, as condições de contorno quando estruturadas em determinadas posições
do programa podem fazer com que a resolução não tenha convergência;
3. No programa do Apêndice A para o projeto 1, as imposições das condições de contorno implícitas para
n
Ci,j não mudaram o número de iterações para cálculo do resíduo. Isso se deve pelo fato de inicialmente
n
tais condições já estarem impostas inicializando a matriz Ci,j como zero nos limites de U∞ , e como o
cálculo só foi realizado para pontos interiores a priori para i = 1, i = IM AX e j = JM AX a matriz já
estava inicializada como zeros;
n n
4. No método SOR, a implementação da condição de contorno Ci,1 = Ci,2 diverge o valor do resíduo. Não
está claro, se é um problema de implementação do programa, ou sequencia de solução numérica;
5. Em geral o método Point-Jacobi apresenta a convergência mais lenta em relação aos outros métodos, além
disso, apresenta problemas de divergência dos resultados quando o resíduo está entre 1e − 5 e 1e − 6. Isso
se deve ao fato do método não utilizar as informações ou características anteriores ao passo ou posição i
e/ou j de cálculo;
6. Os métodos que apresentam o menor número de iterações até 1e − 11 são os métodos SOR e SLOR, no
entanto ao se aproximarem a 1e − 12 o resíduo tende (na média) a se manter constante. Lembrando
que essa condição, depende do fator r de relaxação, pois alterando-o a convergência pode acelerar ou
desacelerar em relação ao número de iterações;
7. Os métodos Gauss-Seidel e Line-Gauss-Seidel, apesar de apresentarem uma convergência mais lenta em
relação aos métodos SOR e SLOR, o resíduo continua decrescendo em função das iterações. Isso se deve
ao fato de assumir r = 1, tais métodos convergirem lentamente ao valor de resíduo requerido;
8. Os resultados de Cp para U∞ = 1.0 e t = 0.10 apesar de convergidos para determinados métodos, não
coincidiram com os resultados de referência, e até então não está claro a resposta para tal diferença;
!==========================================================================
! VARIÁVEIS GLOBAIS UTILIZADAS PARA SOLUÇÃO
!==========================================================================
module v a r _ s o l v e
use var_mesh
i m p l i c i t none
Integer : : SOL, IMAXL,JMAXL, CEPS
r e a l ( kInd = dp ) : : RLX
r e a l ( kInd = dp ) , dImension ( : , : ) , a l l o c a t a b l e : : PHI , C, LPHI
r e a l ( kind = dp ) , dimension ( : , : , : ) , a l l o c a t a b l e : : PHIN
r e a l ( kind = dp ) , dimension ( : ) , a l l o c a t a b l e : : PHIY
r e a l ( kInd = dp ) : : T, UINF
end module v a r _ s o l v e
!==========================================================================
!PROJETO 1 − PROGRAMA PRINCIPAL − ENTREGA 02/04/2018
!==========================================================================
program projeto1_data2018_03_26
use var_mesh
use v a r _ s o l v e
i m p l i c i t none
Integer : : CNUM, IT ,ITMAX, ITVALUE
r e a l ( kInd = dp ) : : XP, UC, VC, U, UJ1 , UJ2 , CP
r e a l ( kInd = dp ) , dImensIon ( : ) , a l l o c a t a b l e : : RESI
!==========================================================================
!DADOS DE ENTRADA
!==========================================================================
ILE = 11
ITE = 31
IMAX = 41
JMAX = 12
XSF = 1 . 2 5
YSF = 1 . 2 5
!==========================================================================
!CASOS
!==========================================================================
CNUM = 1 !ESCOLHER CASO 1 OU 2
s e l e c t case (CNUM)
CASE( 1 )
T = 0.05
UINF = 1 . 0
CASE( 2 )
T = 0.10
UINF = 1 . 0
END SELECT
!==========================================================================
!CÁLCULO DA MALHA
!==========================================================================
c a l l cal_mesh ( )
!==========================================================================
!CÁLCULO DAS CONDIÇÕES DE CONTORNO INICIAIS
!==========================================================================
c a l l cal_bc ( )
!==========================================================================
!ITERACAO E SOLUÇÃO
!==========================================================================
! 1 − JACOBI
! 2 − GAUSS−SEIDEL
! 3 − SOR
! 4 − LINE−GAUSS−SEIDEL
! 5 − SLOR
WRITE( ∗ , 9 0 2 0 )
READ( ∗ , ∗ ) SOL
! WRITE( ∗ , 9 0 3 0 )
! READ( ∗ , ∗ ) CEPS
!
! SELECT CASE(CEPS)
! CASE( 1 )
! EPS = 1E−5
! CASE( 2 )
! EPS = 1E−6
! CASE( 3 )
! EPS = 1E−7
! CASE( 4 )
! EPS = 1E−8
! CASE( 5 )
! EPS = 1E−9
! ENDSELECT
! SOL = 1
EPS = 1E−5
ITMAX = 10000
SELECT CASE(SOL)
CASE( 1 )
RLX = 1 !NAO POSSUI r
OPEN( 1 0 0 2 , FILE = ’ npj_xc_cp . dat ’ )
OPEN( 1 0 0 5 , f I l e = " res_npj . dat " )
OPEN( 1 0 0 6 , f I l e = ’ phi_npj . dat ’ )
CASE( 2 )
RLX = 1 !NAO POSSUI r
OPEN( 1 0 0 2 , FILE = ’ npgs_xc_cp . dat ’ )
OPEN( 1 0 0 5 , f I l e = " res_npgs . dat " )
CASE( 3 )
RLX = 1 . 9 8
OPEN( 1 0 0 2 , FILE = ’ nsor_xc_cp . dat ’ )
OPEN( 1 0 0 5 , f I l e = " r e s _ n s o r . dat " )
OPEN( 1 0 0 6 , f I l e = ’ phi_nsor . dat ’ )
CASE( 4 )
RLX = 1 !NAO POSSUI r
OPEN( 1 0 0 2 , FILE = ’ nlgs_xc_cp . dat ’ )
OPEN( 1 0 0 5 , f I l e = " r e s _ n l g s . dat " )
OPEN( 1 0 0 6 , f I l e = ’ p h i _ n l g s . dat ’ )
CASE( 5 )
RLX = 1 . 9 5
OPEN( 1 0 0 2 , FILE = ’ nslor_xc_cp . dat ’ )
OPEN( 1 0 0 5 , f I l e = " r e s _ n s l o r . dat " )
OPEN( 1 0 0 6 , f I l e = ’ p h i _ n s l o r . dat ’ )
END SELECT
IMAXL = 2
JMAXL = 2
DO IT = 2 ,ITMAX
DO I = 1 ,IMAX
PHIN( IT −1, I , 1 ) = PHIN( IT −1, I , 2 ) − (Y( 2 ) − Y( 1 ) ) ∗ UINF∗PHIY( I )
END DO
PHIN( IT , : , : ) = PHIN( IT − 1 , : , : )
DO J = 2 ,JMAX−1
DO I = 2 ,IMAX−1
LPHI ( I , J ) = AX( I ) ∗PHIN( IT −1, I −1,J ) − &
BX( I ) ∗PHIN( IT −1, I , J ) + &
CX( I ) ∗PHIN( IT −1, I +1,J ) + &
AY( J ) ∗PHIN( IT −1, I , J−1) − &
BY( J ) ∗PHIN( IT −1, I , J ) + &
CY( J ) ∗PHIN( IT −1, I , J+1)
ENDDO
ENDDO
DO J = 2 ,JMAX−1
DO I = 2 ,IMAX−1
IF (ABS( LPHI ( I , J ) ) .GT.ABS( LPHI (IMAXL,JMAXL) ) ) THEN
IMAXL = I
JMAXL = J
ENDIF
ENDDO
ENDDO
IF ( IT .EQ. 2 ) THEN
WRITE( 1 0 0 5 , ∗ ) 1 , RESI ( IT )
END IF
WRITE( 1 0 0 5 , ∗ ) IT , RESI ( IT )
IF ( RESI ( IT)<EPS) THEN
ITVALUE = IT
EXIT
ENDIF
SELECT CASE(SOL)
CASE( 1 )
CALL NPJ ( )
CASE( 2 )
CALL NPGS( )
CASE( 3 )
CALL NSOR( )
CASE( 4 )
CALL NLGS( )
CASE( 5 )
CALL NSLOR( )
END SELECT
DO J = 1 ,JMAX
DO I = 1 ,IMAX
PHIN( IT , I , J ) = PHIN( IT −1, I , J ) + C( I , J )
END DO
END DO
WRITE( ∗ , ∗ ) IT , RESI ( IT )
ENDDO
WRITE( ∗ , 9 0 0 0 )
DO I = ILE , ITE
XP = X( I )
UC = ( UJ1 + UJ2 ) / 2 E0
VC = UINF∗PHIY( I )
U = SQRT(UC∗∗2E0 + VC∗∗2E0 )
CP = ( 1 − (U/UINF) ∗ ∗ 2 E0 )
OPEN( 1 0 0 3 , f I l e = ’ p h i . dat ’ )
DO I = 1 ,IMAX
WRITE( 1 0 0 3 , ∗ ) ( PHI ( I , J ) , J=1,JMAX)
END DO
! OPEN( 1 0 0 4 , f I l e = ’ l p h i . dat ’ )
! DO I = 1 ,IMAX
! WRITE( 1 0 0 4 , ∗ ) ( LPHI( I , J ) , J=1,JMAX)
! END DO
DO I = 1 ,IMAX
DO J = 1 ,JMAX
WRITE( 1 0 0 6 , ∗ )X( I ) ,Y( J ) , PHI ( I , J )
END DO
WRITE( 1 0 0 6 , ∗ ) ! Linha "Dummy" para p l o t a r no g n u p l o t
END DO
DEALLOCATE(X,DTX)
DEALLOCATE(Y,DTY)
DEALLOCATE( PHI , LPHI , PHIN)
!==========================================================================
!CALCULO DA MALHA
!==========================================================================
subroutine cal_mesh ( )
use var_mesh
i m p l i c i t none
!=========================================================================
!XGRID
!=========================================================================
a l l o c a t e (X(IMAX) )
a l l o c a t e (DTX(IMAX) )
DO I = ILE , ITE
X( I ) = ( I − ILE ) ∗DX
END DO
DO I = ITE+1,IMAX
X( I ) = X( I −1) + (X( I −1) − X( I −2))∗XSF
END DO
DO I = ILE −1 ,1 , −1
X( I ) = X( I +1) + (X( I +1) − X( I +2))∗XSF
END DO
DO I = 2 ,IMAX−1
DTX( I ) = (X( I +1) − X( I −1))/2
ENDDO
!=========================================================================
!YGRID
!=========================================================================
a l l o c a t e (Y(JMAX) )
a l l o c a t e (DTY(JMAX) )
Y( 1 ) = −DX/2
Y( 2 ) = +DX/2
DO J = 3 ,JMAX
Y( J ) = Y( J−1) + (Y( J−1) − Y( J −2))∗YSF
END DO
DO J = 2 ,JMAX−1
DTY( J ) = (Y( J+1) − Y( J −1))/2
ENDDO
!=========================================================================
! COEFICIENTES PARA CALCULAR LPHI
!=========================================================================
ALLOCATE(AX(IMAX) ,BX(IMAX) ,CX(IMAX) )
ALLOCATE(AY(JMAX) ,BY(JMAX) ,CY(JMAX) )
DO I = 2 ,IMAX−1
AX( I ) = 1 / ( (X( I ) − X( I −1))∗DTX( I ) )
CX( I ) = 1 / ( (X( I +1) − X( I ) ) ∗DTX( I ) )
BX( I ) = AX( I ) + CX( I )
ENDDO
DO J = 2 ,JMAX−1
AY( J ) = 1 / ( (Y( J ) − Y( J −1))∗DTY( J ) )
CY( J ) = 1 / ( (Y( J+1) − Y( J ) ) ∗DTY( J ) )
BY( J ) = AY( J ) + CY( J )
ENDDO
RETURN
end subroutIne cal_mesh
!==========================================================================
!CONDIÇÕES DE CONTORNO
!==========================================================================
subroutIne cal_bc ( )
use var_mesh
use v a r _ s o l v e
PHI ( : , : ) = 0
PHIY ( : ) = 0
PHIN ( 1 , : , : ) = 0
LPHI ( : , : ) = 0
C( : , : ) = 0
DO I = 1 ,IMAX
PHI ( I , : ) = UINF∗X( I )
END DO
DO I = ILE , ITE
PHIY( I ) = 2∗T∗ ( 1 − 2∗X( I ) )
END DO
PHIN ( 1 , : , : ) = PHI ( : , : )
RETURN
end subroutIne cal_bc
!==========================================================================
! JACOBI (OU POINT−JACOBI)
!==========================================================================
subroutIne NPJ ( )
use var_mesh
use v a r _ s o l v e
DO J = 2 ,JMAX−1
DO I = 2 ,IMAX−1
C( I , J ) = LPHI ( I , J ) / ( 2 ∗ ( 1 / (DTX( I ) ∗ ∗ 2 ) + 1 / (DTY( J ) ∗ ∗ 2 ) ) )
END DO
END DO
RETURN
END SUBROUTINE NPJ
!==========================================================================
!GAUSS_SEIDEL (OU POINT−GAUSS_SEIDEL)
!==========================================================================
subroutIne NPGS( )
use var_mesh
use v a r _ s o l v e
DO J = 2 ,JMAX−1
DO I = 2 ,IMAX−1
C( I , J ) = ( LPHI ( I , J ) ∗ (DTX( I ) ∗DTY( J ) ) ∗ ∗ 2 + &
C( I −1,J ) ∗DTY( J ) ∗ ∗ 2 + &
C( I , J −1)∗DTX( I ) ∗ ∗ 2 ) ∗ &
(RLX/ 2 ) ∗ 1 / (DTX( I ) ∗ ∗ 2 + DTY( J ) ∗ ∗ 2 )
END DO
END DO
RETURN
END SUBROUTINE NPGS
!==========================================================================
!SOR (SUCCESSIVE OVERRELAXATION)
!==========================================================================
subroutIne NSOR( )
use var_mesh
use v a r _ s o l v e
DO J = 2 ,JMAX−1
DO I = 2 ,IMAX−1
C( I , J ) = ( LPHI ( I , J ) ∗ (DTX( I ) ∗DTY( J ) ) ∗ ∗ 2 + &
C( I −1,J ) ∗DTY( J ) ∗ ∗ 2 + &
C( I , J −1)∗DTX( I ) ∗ ∗ 2 ) ∗ &
(RLX/ 2 ) ∗ 1 / (DTX( I ) ∗ ∗ 2 + DTY( J ) ∗ ∗ 2 )
END DO
END DO
DO I = 1 ,IMAX
C( I ,JMAX) = 0
!A i m p o s i ç ão d e s s a c o n d i ç ão de c o n t o r n o e x p l o d e a m a t r i z
! C( I , 1 ) = C( I , 2 )
ENDDO
DO J = 1 ,JMAX
C( 1 , J ) = 0
C(IMAX, J ) = 0
ENDDO
RETURN
END SUBROUTINE NSOR
!==========================================================================
! LINE−GAUSS−SEIDEL
!==========================================================================
subroutine NLGS( )
use var_mesh
use v a r _ s o l v e
DO I = 2 ,IMAX−1
DO J = 2 ,JMAX−1
AT( J ) = AY( J )
BT( J ) = −(2/(DTX( I ) ∗ ∗ 2 ) + BY( J ) )
CT( J ) = CY( J )
DT( J ) = −(LPHI ( I , J ) + C( I −1,J ) / (DTX( I ) ∗ ∗ 2 ) )
ENDDO
!=========================================================================
!THOMAS
!=========================================================================
! CJP( 1 ) = CT( 1 ) /BT( 1 )
DO J = 2 ,JMAX−1
CJP( J ) = CT( J ) / (BT( J ) − AT( J ) ∗CJP( J −1))
ENDDO
C( I ,JMAX−1) = DJP(JMAX)
DO J = JMAX−1 ,1 , −1
C( I , J ) = DJP( J ) − CJP( J ) ∗C( I , J+1)
ENDDO
ENDDO
DO I = 1 ,IMAX
C( I ,JMAX) = 0
C( I , 1 ) = C( I , 2 )
ENDDO
DO J = 1 ,JMAX
C( 1 , J ) = 0
C(IMAX, J ) = 0
ENDDO
RETURN
END SUBROUTINE NLGS
!==========================================================================
!SLOR
!==========================================================================
subroutine NSLOR( )
use var_mesh
use v a r _ s o l v e
DO I = 2 ,IMAX−1
DO J = 2 ,JMAX−1
AT( J ) = AY( J )
BT( J ) = −(2/(DTX( I ) ∗ ∗ 2 ) + BY( J ) )
CT( J ) = CY( J )
DT( J ) = −RLX∗ ( LPHI ( I , J ) + C( I −1,J ) / (DTX( I ) ∗ ∗ 2 ) )
ENDDO
!=========================================================================
!THOMAS
!=========================================================================
! CJP( 1 ) = CT( 1 ) /BT( 1 )
DO J = 2 ,JMAX−1
CJP( J ) = CT( J ) / (BT( J ) − AT( J ) ∗CJP( J −1))
ENDDO
C( I ,JMAX−1) = DJP(JMAX)
DO J = JMAX−1 ,1 , −1
C( I , J ) = DJP( J ) − CJP( J ) ∗C( I , J+1)
ENDDO
ENDDO
DO I = 1 ,IMAX
C( I ,JMAX) = 0
C( I , 1 ) = C( I , 2 )
ENDDO
DO J = 1 ,JMAX
C( 1 , J ) = 0
C(IMAX, J ) = 0
ENDDO
! DO I = 1 ,IMAX
! WRITE( 1 0 1 4 , ∗ ) (C( I , J ) , J=1,JMAX)
! END DO
RETURN
END SUBROUTINE NSLOR