Você está na página 1de 4

! Ex1_Aula4_CFD_Jacobi.

f90
!
! FUNCTIONS:
! Ex1_Aula4_CFD_Jacobi - Entry point of console application.
!

!****************************************************************************
!
! PROGRAM: Ex1_Aula4_CFD_Jacobi
!
! PURPOSE: Entry point for the console application.
!
!****************************************************************************

program Ex1_Aula4_CFD_Jacobi

!EXEMPLO 1 DA AULA DE CFD - TEMPERATURA PRESCRITA NAS PAREDES

implicit none
integer, parameter:: nv=50 !Número de Volumes de controle do domínio
integer:: i !Variável auxiliar para percorrer os nós
real:: L, dx, T_est, erro, kmax, k !Comprimento da barra, dx, Estimativa da
temperatura, erro, número máximo de iterações, condutividade térmica
real, dimension(nv):: Aw, Ap, Ae, Sp, Su !Variáveis do método: uma para cada

real, dimension(nv):: T, x
real:: Tp1, Tp2 !Temperaturas prescritas na esquerda e na direita
write(*,*)'Qual o valor da temperatura da parede em x = 0?'
read(*,*)Tp1
write(*,*)'Qual o valor da temperatura da parede em x = L?'
read(*,*)Tp2

!*DANDO VALORES PARA AS VARIÁVEIS DO PROGRAMA!*


L = 1
dx = L/nv
k=25
T_est = 25
erro = 10**(-4)
kmax=80000

!PASSO 1: estimativa do campo inicial de temperaturas


do i=1,nv

T(i) = T_est

end do

!Cálculo da malha
x(1) = 0.5D0*dx !!O primeiro comprimento é metade do dx "normal" entre as
células
do i = 2,nv

x(i) = x(i-1) + dx

end do

!write(*,*) x

!CÁLCULO DAS TEMPERATURAS ATRAVÉS DO MVF


do i=1,nv

if(i==1) then

Ae(i) = 1
Aw(i) = 0
Su(i) = 2*Tp1
Sp(i) = -2
Ap(i) = Aw(i) + Ae(i) - Sp(i)

else if((i>1).and.(i<nv)) then

Aw(i) = 1
Ae(i) = 1
Su(i) = 0
Sp(i) = 0
Ap(i) = Aw(i) + Ae(i) - Sp(i)

else

Aw(i) = 1
Ae(i) = 0
Su(i) = 2*Tp2
Sp(i) = -2
Ap(i) = Aw(i) + Ae(i) - Sp(i)

end if
end do

call jacobi(Ae,Aw,Su,Ap,nv,T,erro,kmax)
!Resultados plotados no TecPlot:
!Temperatura através de MVF:
150 format(2x,30(F20.12,1X))
open(15,file="Tnum.plt")
write(15,*) 'Title="Tnum"'
write(15,*) "Variables= 'x', 'T'"
write(15,*) 'ZONE T = "CAMPO" i=',nv

do i=1,nv
write(15,150) x(i), T(i)
enddo

close(15)

contains

SUBROUTINE jacobi(Ae, Aw, Su, Ap, N, A, erro, kmax)


implicit none
integer::i, k, it_final
integer, intent(in)::N
real, dimension(N):: Ae, Aw, Su, Ap
real, dimension(N):: T
real, dimension(1:N,1:2):: M
real, dimension(N):: Ri, A
real:: RMS, erro, kmax, residue

!it_final = variável que armazena o valor da iteração final


!M: Matriz problema (posição x iteração)
!Ri: Resíduo do ponto i
!RMS: resíduo médio quadrático da iteração k+1

!estimativa inicial da variável


do i=1,N

M(i,1) = A(i) !Ai é oriundo do programa principal

end do

k = 1 !inicializando o contador de iterações


do while (k < kmax)

do i=1,N

if(i==1)then

M(i,2) = (Ae(i)*M(1+i,1)+Su(i))/Ap(i)

elseif((i>1).and.(i<N)) then

M(i,2) = (Aw(i)*M(i-1,1)+Ae(i)*M(i+1,1))/Ap(i)

else

M(i,2) = (Aw(i)*M(i-1,1))/Ap(i)

end if

end do

!Cálculo do resíduo
do i=1,N

if((i>1).and.(i<n))then
!Resíduo local

Ri(i) = abs(Su(i)+Ae(i)*M(1+i,2)+Aw(i)*M(i-1,2)-
Ap(i)*M(i,2))

!Resíduo da iteração

RMS = RMS + Ri(i)**2.0D0


end if

end do

RMS = RMS**0.5D0

!Avanço da iteração
do i=1,N
M(i,1) = M(i,2)
end do

if (RMS < erro) then

it_final = k
k = kmax !força o final das iterações
residue = RMS

else

k = k+1
it_final = k
residue = RMS

end if

end do

!Resultado retornado p/ o programa principal


do i=1,N

A(i)= M(i,2)

enddo

END SUBROUTINE jacobi

end program Ex1_Aula4_CFD_Jacobi !FIMDO PROGRAMA PRINCIPAL