module CANAL_PLOTA

! sigla = PLOTA_

! objetivos: 
!            1 - gerar arquivos de dados para executar o programa Wgnuplot
!            2 - mostrar gráficos usando o programa Wgnuplot

! versão original 1.0 (26 Mai 99)

! programador: Carlos Henrique Marchi
! local:       SINMEC/UFSC - Florianópolis - SC

! versão atual    1.2 ( 7 Dez 99)

! última alteração =   19 Jan 00

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

! RELAÇÃO DAS ROTINAS DESTE MÓDULO:

  ! CANAL_PLOTA_copia_Wgnuplot
  ! CANAL_PLOTA_executa_Wgnuplot
  ! CANAL_PLOTA_gera_gnu
  ! CANAL_PLOTA_gera_nomes
  ! CANAL_PLOTA_le_dados
  ! CANAL_PLOTA_le_dados_gnu
  ! CANAL_PLOTA_le_inicio

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

! rotinas onde são lidos ARQUIVOS de dados neste MÓDULO:

  ! CANAL_PLOTA_gera_nomes
  ! CANAL_PLOTA_le_dados
  ! CANAL_PLOTA_le_dados_gnu
  ! CANAL_PLOTA_le_inicio

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

! rotinas onde são gerados ARQUIVOS neste MÓDULO:

  ! CANAL_PLOTA_executa_Wgnuplot
  ! CANAL_PLOTA_gera_gnu

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

! programas auxiliares usados neste MÓDULO:

  ! Wgnuplot.exe

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

use dados_rhg
use CANAL_ARQUIVO ! versão 1.2 (19 Jan 00)

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

implicit none

character*(100),private :: titulo        ! título do gráfico
integer,private         :: estilo_curvas ! estilo das curvas: 1=linhas; 2=símbolos; 3=linhas com símbolos
integer,private         :: grid          ! 1=mostra linhas auxiliares para facilitar leitura; 0=não
integer,private         :: dia_int       ! 1=inclui data no título do gráfico; 0=não
integer,private         :: hora_int      ! 1=inclui hora no título do gráfico; 0=não
integer,private         :: num_curvas    ! número de curvas a plotar

character*(100),private :: label_x       ! título das abscissas
integer,private         :: escala_x      ! tipo de escala: 1=linear; 2=logarítmica
integer,private         :: auto_x        ! limites da escala: 0=automático; 1=definido
real*8 ,private         :: inicio_x      ! limite mínimo da escala
real*8 ,private         :: fim_x         ! limite máximo da escala

character*(100),private :: label_y       ! título das ordenadas
integer,private         :: escala_y      ! tipo de escala: 1=linear; 2=logarítmica
integer,private         :: auto_y        ! limites da escala: 0=automático; 1=definido
real*8 ,private         :: inicio_y      ! limite mínimo da escala
real*8 ,private         :: fim_y         ! limite máximo da escala

character*(50),dimension(:),allocatable,private :: nome_curva ! nome do arquivo .dat a plotar
character*(50),dimension(:),allocatable,private :: legenda    ! legenda da curva a plotar

integer,private :: lista ! lista conteúdo do arquivo de dados do módulo PLOTA
integer,private :: le    ! lê conteúdo do arquivo de dados do módulo PLOTA
integer,private :: copia ! gera back up do arquivo de dados do módulo PLOTA

character*50,private :: nome_plota ! nome do arquivo de dados do módulo PLOTA

integer,private :: i   ! número da curva

character*100,private :: arq     ! linha de comando
character*220,private :: comando ! linha de comando

logical,private :: dos ! acessa prompt dos

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

contains

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

  subroutine CANAL_PLOTA_copia_Wgnuplot

    character*(150) :: trabalho ! nome do diretório para saídas
    character*(50)  :: caso     ! nome do caso

    call CANAL_ARQUIVO_passa_diretorio_trabalho ( trabalho )
    call CANAL_ARQUIVO_passa_caso ( caso )

    comando = 'copy Wgnuplot.exe '// trim(trabalho) // 'Wgnuplot.exe'

    dos = systemqq ( comando )

  end subroutine CANAL_PLOTA_copia_Wgnuplot

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

  subroutine CANAL_PLOTA_executa_Wgnuplot ( unit, nome_arquivo )

    integer,intent(in) :: unit ! identificador do arquivo

    character*(*),intent(in) :: nome_arquivo   ! nome do arquivo
    character*(150) :: trabalho ! nome do diretório para saídas

    call CANAL_ARQUIVO_passa_diretorio_trabalho ( trabalho )

    open  ( unit, file = 'executa.bat' )

    write ( unit, * ) 'cd ' // trim(trabalho)
    write ( unit, * ) 'Wgnuplot '//trim(nome_arquivo)

    close ( unit )

    dos = systemqq ( 'executa.bat' )

  end subroutine CANAL_PLOTA_executa_Wgnuplot

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

  subroutine CANAL_PLOTA_gera_gnu ( unit, nome_arquivo )

    integer,intent(in) :: unit ! identificador do arquivo

    character*(*),intent(in) :: nome_arquivo ! nome do arquivo .gnu a gerar

    character*(12) :: dia        ! data
    character*(8)  :: hora       ! horário
    character*(50) :: legenda_p  ! legenda da curva a plotar
    character*(50) :: aux1, aux2 ! auxiliares

    ! cria arquivo .gnu

    call CANAL_ARQUIVO_cria_arquivo ( unit, nome_arquivo )

    ! escreve no arquivo .gnu as funções desejadas

    ! estilo das curvas
    select case ( estilo_curvas )
       case ( 1 ) ! linhas
          write(unit,"('set data style lines')")
       case ( 2 ) ! símbolos
          write(unit,"('set data style points')")
       case ( 3 ) ! linhas com símbolos
          write(unit,"('set data style linespoints')")
    end select

    if ( grid == 1 ) write(unit,"('set grid')") ! mostra a malha 

    comando = ' '

    ! inclui a data no título do gráfico
    if ( dia_int == 1 ) then
       call CANAL_ARQUIVO_passa_data ( dia )
       comando = trim(comando) // trim(dia)
    end if

    ! inclui a hora no título do gráfico
    if ( hora_int == 1 ) then
       call CANAL_ARQUIVO_passa_hora ( hora )
       comando = trim(comando) // ' ' // trim(hora)
    end if

    ! escreve título do gráfico
    arq = "set title '" // trim(titulo)
    comando = trim(arq) // ' ' // trim(comando) // "'"
    write(unit,"(a220)") comando

    ! escreve título das abscissas
    arq = "set xlabel '" // trim(label_x) // "'"
    write(unit,"(a100)") arq
   
    if ( escala_x == 2 ) write(unit,"('set logscale x')") ! define escala X logarítmica

    ! define limites da escala das abscissas
    if ( auto_x == 1 ) then
       write(aux1,*) inicio_x
       write(aux2,*) fim_x
       comando = "set xrange[" // trim(adjustl(aux1)) // ":" // trim(adjustl(aux2)) // "]" 
       write(unit,"(a100)") comando
    end if

    ! escreve título das ordenadas
    arq = "set ylabel '" // trim(label_y) // "'"
    write(unit,"(a100)") arq

    if ( escala_y == 2 ) write(unit,"('set logscale y')") ! define escala Y logarítmica

    ! define limites da escala das ordenadas
    if ( auto_y == 1 ) then
       write(aux1,*) inicio_y
       write(aux2,*) fim_y
       comando = "set yrange[" // trim(adjustl(aux1)) // ":" // trim(adjustl(aux2)) // "]" 
       write(unit,"(a100)") comando
    end if

    ! comando para plotar a curva 1
    comando = "plot '" // trim(nome_curva(1)) // "' title '" // trim(legenda(1)) // "'"
    write(unit,"(a220)") comando

    ! comando para plotar curvas 2 a num_curvas
    if ( num_curvas > 1 ) then
       do i = 2, num_curvas
          comando = "replot '" // trim(nome_curva(i)) // "' title '" // trim(legenda(i)) // "'"
          write(unit,"(a220)") comando
       end do
    end if

    close(unit)

  end subroutine CANAL_PLOTA_gera_gnu

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

  subroutine CANAL_PLOTA_gera_nomes ( unit, extensao )

    integer,intent(in)       :: unit     ! identificador do arquivo
    character*(*),intent(in) :: extensao ! extensão a acrescentar ao nome_curva

    open ( unit, file = trim(nome_plota) )

    read ( unit, * ) num_curvas

    do i = 1, num_curvas
       read ( unit, * ) nome_curva(i), legenda(i)
    end do

    close ( unit )

    do i = 1, num_curvas
       nome_curva(i) = trim(nome_curva(i)) // trim(extensao)
    end do

  end subroutine CANAL_PLOTA_gera_nomes

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

  subroutine CANAL_PLOTA_le_dados ( unit )

    integer,intent(in) :: unit ! identificador do arquivo

    open ( unit, file = trim(nome_plota) )

    read ( unit, * ) num_curvas

    if (itg_rhg == itg_rhg_max) allocate ( nome_curva(num_curvas), legenda(num_curvas) )

    do i = 1, num_curvas
       read ( unit, * ) nome_curva(i), legenda(i)
    end do

    close ( unit )

  end subroutine CANAL_PLOTA_le_dados

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

  subroutine CANAL_PLOTA_le_dados_gnu ( unit, nome )

    integer,intent(in)       :: unit ! identificador do arquivo
    character*(*),intent(in) :: nome ! nome do arquivo de dados
    
    open ( unit, file = trim(nome) )

    read ( unit, * ) estilo_curvas
    read ( unit, * ) grid
    read ( unit, * ) titulo
    read ( unit, * ) dia_int
    read ( unit, * ) hora_int
    read ( unit, * ) label_x
    read ( unit, * ) escala_x
    read ( unit, * ) auto_x
    read ( unit, * ) inicio_x
    read ( unit, * ) fim_x
    read ( unit, * ) label_y
    read ( unit, * ) escala_y
    read ( unit, * ) auto_y
    read ( unit, * ) inicio_y
    read ( unit, * ) fim_y

    close ( unit )

  end subroutine CANAL_PLOTA_le_dados_gnu

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

  subroutine CANAL_PLOTA_le_inicio ( unit, nome )

    integer,      intent(in) :: unit ! unidade do arquivo
    character*(*),intent(in) :: nome ! nome do arquivo de dados de configuração do módulo

    open ( unit, file = trim(nome) )

    read ( unit, * ) nome_plota 
    read ( unit, * ) lista
    read ( unit, * ) le
    read ( unit, * ) copia

    close ( unit )

    if ( lista == 1 ) call CANAL_ARQUIVO_notepad_abre_dado ( nome_plota )

    if ( le    == 1 ) call CANAL_PLOTA_le_dados ( unit )

    if ( copia == 1 ) call CANAL_ARQUIVO_copia_arquivo ( nome_plota )

  end subroutine CANAL_PLOTA_le_inicio

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

end module CANAL_PLOTA
