program LAPLACE

!     Difusão Bidimensional Permanente

!     Versão original 1.0 (20 Mar 99)
!     Versão atual    3.1 (23 Mar 09)
!        Subversão atual 3.1.14 (26 Abr 09)
!        Última alteração =      26 Abr 09

!     MODELO NUMÉRICO (resumo)
!       método numérico: diferenças finitas
!       função de interpolação: CDS
!       comprimento entre os pontos: constante em cada direção
!       solver: Gauss-Seidel
!       precisão: dupla
!       os primeiros e últimos pontos estão sobre os contornos
!       com Multigrid; razão de pontos entre as malhas = 2

!     ARQUIVOS envolvidos no programa:
!       laplace3.f90 = programa principal
!       coef.f90     = calcula coeficientes do sistema linear
!       dados.f90    = lê e lista os dados do programa
!       result.f90   = resolve equações e gera listagem dos resultados
!       solvers.f90  = solvers disponíveis
!       varia.f90    = define todas as variáveis globais do programa
!       laplace3.ent = arquivo de dados do programa
!       *.*          = listagem dos resultados
!       notepad.exe  = editor dos arquivos

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

use resultados

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

implicit none

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

  call le_dados

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

  if ( nm == 1 ) call solucao_numerica_monogrid

  if ( nm /= 1 ) call solucao_numerica_multigrid

  open(10,file=caso)

  call data_e_hora

  write(10,17) 
  17 format(/,'*** Listagem gerada pelo programa Laplace 3.1.14, de 26 Abr 2009 ***')

  write(10,18) dia, hora
  18 format(/,5x,'Dia = ',a12,5x,'Hora = ',a8)

  head = trim(title)//" "//trim(dia)//"'"

  call mostra_dados

  write(10,6) normai(0)
  6 format(/,1pe15.6,' = norma L1 dos resíduos (R) com base na estimativa inicial [L1(R)o]')

  write(10,3) 
  3 format(/,t3,'Iteração',t14,'L1(R)i/L1(R)o',t29,'q',t44,'qmed')

  write(10,4) 0, 1.0d0

  do it = 1, itr
     write(10,4) it, normai(it)/normai(0), normai(it)/normai(it-1), &
                     (normai(it)/normai(0))**(1.0d0/it)
     4 format(2x,i8,3(1pe15.6))
  end do

  if ( escreve == 1 ) then
     write(10,5)
     5 format(//,30x,'TEMPERATURAS')
     call print1(t,ny,nx,nxy)
  end if

  write(10,31) tcpu
  31 format(/, f14.3, ' = tempo de CPU (segundos)')

  close (10)

  note_caso = 'notepad '//caso
  dos = system(note_caso) ! lista arquivo de resultados

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

end

