program series

use portlib

implicit none
integer :: i, n, ver, tipo_serie
real*8  :: soma, exato, erro, termo

call dados

open(6,file="saida18a.txt")
write(6,10)
10 format("#      i", t17,"termo", t47,"soma", t77,"erro")

select case ( tipo_serie )
  case ( 1 )
     call serie_1
  case ( 2 )
     call serie_2
  case ( 3 )
     call serie_3
end select

close(6)

ver = system ("Notepad saida18a.txt")

call grafico

!-------------------------------------------------

contains

!-------------------------------------------------

subroutine dados

  ver = system ("Notepad dados18a.txt")

  open(5,file="dados18a.txt")
  read(5,*) tipo_serie
  read(5,*) n
  close(5)

end subroutine dados

!-------------------------------------------------

subroutine serie_1

  ! calcula soma de uma série geométrica

  exato = 1

  soma = 0

  do i = 1, n
     termo = 1.0d0 / ( 2.0d0 ** i )
     soma  = soma + termo
     erro  = dabs(exato - soma) 
     write(6,10) i, termo, soma, erro
     10 format( i8, 3(1pe30.15e3) )
  end do

end subroutine serie_1

!-------------------------------------------------

subroutine serie_2

  ! calcula soma da série de pi

  exato = dacos(-1.0d0)

  soma = 0

  do i = 0, n
     termo = 4.0d0 * ((-1)**i) / ( 2.0d0 * i + 1 )
     soma  = soma + termo
     erro  = dabs(exato - soma) 
     write(6,10) i, termo, soma, erro
     10 format( i8, 3(1pe30.15e3) )
  end do

end subroutine serie_2

!-------------------------------------------------

subroutine serie_3

  ! calcula soma da série de e

  real*8 fatorial_i

  exato = dexp(1.0d0)

  soma = 0

  do i = 0, n
     call fatorial ( i, fatorial_i)
     termo = 1 / fatorial_i
     soma  = soma + termo
     erro  = dabs(exato - soma) 
     write(6,10) i, termo, soma, erro
     10 format( i8, 3(1pe30.15e3) )
  end do

end subroutine serie_3

!-------------------------------------------------

subroutine fatorial(j,fat)

  ! calcula o fatorial de j

  integer j
  real*8  fat, k

  fat = 1

  do k = 2, j
     fat = fat * k
  end do

end subroutine fatorial

!-------------------------------------------------

subroutine grafico

  integer k

  open(9,file="comandos18a.gnu")
  do k = 1, 7
     read(9,*)
  end do

  select case ( tipo_serie )
     case ( 1 )
        write(9,*) "set title 'série geométrica'"
     case ( 2 )
        write(9,*) "set title 'série de pi'"
     case ( 3 )
        write(9,*) "set title 'série de e'"
  end select

  write(9,*) "replot"

  close(9)

  ver = system ("Wgnuplot comandos18a.gnu")

end subroutine grafico

!-------------------------------------------------

end program series
