! Cosmo D. Santiago (2004)
! Subrotina TDMA 
! Usado para resolver sistemas tridiagonais

subroutine TDMA(N,AW,AP,AE,BP,TN)

    implicit none

    integer:: k                           ! número do nó
    real*8 :: div                         ! variável auxiliar
    integer,intent(in)  :: N              ! número de nós ou volumes
    real*8,allocatable, dimension(:) :: P              ! coeficiente do tdma
    real*8,allocatable, dimension(:) :: Q              ! coeficiente do tdma
    real*8,intent(in), dimension(N) :: AP ! coeficiente aP
    real*8,intent(in), dimension(N) :: AW ! coeficiente aW
    real*8,intent(in), dimension(N) :: AE ! coeficiente aE
    real*8,intent(in), dimension(N) :: BP ! termo fonte bP

    real*8,intent(out),dimension(N) :: TN  ! variável de interesse

    allocate(P(N), Q(N))

    P(1) = AE(1) / AP(1)
    Q(1) = BP(1) / AP(1)
    
  do k=2,N
      div = AP(k) - AW(k)*P(k-1)
      P(k) = AE(k) / div
      Q(k) = (BP(k) + AW(k)*Q(k-1))/ div
      
  end do
    
  TN(N) = Q(N)

  do k = N-1,1,-1
      TN(k) = P(k)*TN(k+1) + Q(k)
  end do

  deallocate(P, Q)

end subroutine TDMA