program LAPLACE

!     Difusão Bidimensional Permanente

!     Versão original 1.0 (20 Mar 99)

!     Versão atual    3.0 (28 Jun 99)


!     última alteração =   29 Jun 99


!     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
!       sem fictícios
!       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
!       *.lis        = listagem dos resultados
!       *.itn        = arquivo de resultados da solução numérica (iterativo)
!       *.num        = arquivo de resultados da solução numérica (discretização)
!       notepad.exe  = editor dos arquivos

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


use resultados

use msfwin

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

implicit none

real*8 :: a1, a2, a3 ! auxiliares

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

  name=setwindowtext(gethwndqq(qwin$framewindow),  &
       "LAPLACE 3.0 (Difusão Bidimensional Permanente)"C)

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

  call le_dados

  open(10,file=caso)

  call date_and_time(vardate,vartime,varzone,var)

  write(aux,*) var(3)
  aux1 = trim(adjustl(aux))
  write(aux,*) var(2)
  aux2 = trim(adjustl(aux))
  write(aux,*) var(1)
  aux3 = trim(adjustl(aux))
  dia = '('//trim(aux1)//'/'//trim(aux2)//'/'//aux3//')'

  write(aux,*) var(5)
  aux1 = trim(adjustl(aux))
  write(aux,*) var(6)
  aux2 = trim(adjustl(aux))
  write(aux,*) var(7)
  aux3 = trim(adjustl(aux))
  hora = trim(aux1)//':'//trim(aux2)//':'//aux3

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

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

  call mostra_dados

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

  open(8,file=arq_rex_numerico_itn)

  a1 = dacos(-1.0d0)

  a2 = dsinh(a1/2) / dsinh(a1)

  a3 = 2.0d0*(dcosh(a1)-1) / ((a1**2) * dsinh(a1))

  write(8,1) title, dia, hora, 2, itmax, 10, nm, nxg(nm), &
             nyg(nm), nxyg(nm), tolt, nitm, problema,     &
             tipo_ci, a2, a3

  1 format(5x,a50,5x,a12,5x,a8,//, &
            i8,12x,'   = número de variáveis',/, &
            i8,12x,'   = número máximo de iterações externas',/, &
            i8,/, &
            i8,12x,'   = número de malhas',/, &
            i8,12x,'   = número de pontos em X (malha mais fina)',/, &
            i8,12x,'   = número de pontos em Y (malha mais fina)',/, &
            i8,12x,'   = número total de pontos (malha mais fina)',/, &
           1pe22.9,' = tolerância do problema',/, &
            i8,12x,'   = número máximo de iterações internas (Gauss-Seidel)',/, &
            i8,12x,'   = 1:c.c.linear; 2:c.c.senoidal',/, &
            i8,12x,'   = tipo da condição inicial: 0=nula; 1=solução analítica; 2=reinício',//, &
               5x,'Resultados Numéricos Exatos',/, &
             1pe30.19,3x,"'Temperatura Central'",/, &
             1pe30.19,3x,"'Temperatura Média'",//, &               
             t8,'n',t14,'T Central',t38,'T Média')

  write(10,3) 
  3 format(//,t3,'Iteração',t14,'Norma L1 / norma inicial')

  if ( nm == 1 ) call solucao_numerica_monogrid

  if ( nm /= 1 ) call solucao_numerica_multigrid

  write(10,31) tcpu
  31 format(//,1pe20.9,' = tempo de processamento (s)')

  close(8)

  call rex_numerico (arq_rex_numerico_num,t,tmed)

  note_caso = 'notepad '//arq_rex_numerico_itn
  dos = systemqq(note_caso) ! lista arquivo de resultados
!  note_caso = 'vi '//arq_rex_numerico_itn
!  call system(note_caso) ! lista arquivo de resultados

  close (10)

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

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

fim = setexitqq(qwin$exitnopersist) 

end

