module dados

! objetivo: ler e escrever os dados do programa

use variaveis

implicit none

contains

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

  subroutine le_dados

    ! leitura do nome do arquivo principal de dados do CASO a analisar
    dos = system('notepad Richardson_3p0.in') ! lista arquivo
    open(in,file='Richardson_3p0.in')
    read(in,*) arq_dados
	close(in)

    ! leitura dos dados principais
    note_caso = 'notepad ' // trim(adjustl(arq_dados))
    dos = system( note_caso ) ! lista arquivo
    open(in,file=trim(adjustl(arq_dados)))

    read(in,*) variavel
    read(in,*) caso
    read(in,*) com_solucao_analitica
    read(in,*) arq_exato
    read(in,*) pL
    read(in,*) dpL
    read(in,*) Fs
    read(in,*) tipo_refino
    read(in,*) numero_iteracoes
    read(in,*) tol
    read(in,*) pU_min
    read(in,*) pU_max
    read(in,*) nm

    ! alocação de memória
    allocate ( h(nm), Th(nm), Eh(nm), pV(nm), pVt(nm) )
    allocate ( Ti_12(nm), Ti_13(nm), Ti_23(nm), Ti_pU(nm),  Tbi_pU(nm), &
               Tc_12(nm), Tc_13(nm), Ti_bi(nm), Ti_tri(nm)  )
    allocate ( Ei_12(nm), Ei_13(nm), Ei_23(nm), Ei_pU(nm),  Ebi_pU(nm), &
               Ec_12(nm), Ec_13(nm), Ei_bi(nm), Ei_tri(nm)  )
    allocate ( pE_h(nm),  pE_i(nm),  pE_bi(nm), pE_c12(nm), pE_c13(nm), &
               pU_h(nm),  pU_i(nm),  pU_bi(nm), pU_c12(nm), pU_c13(nm)  )
    allocate ( Ud(nm), Uri_12(nm), Uri_13(nm), Uri_23(nm), Uri_pU(nm),  &
                       Uc_12(nm),  Uc_13(nm),  Uri_bi(nm), Uri_tri(nm), &
                       Uri_p(nm),  GCI_p(nm),  GCI_pL(nm)  )
    allocate ( it_pU_h(nm), it_pU_i(nm), it_pU_bi(nm), it_pU_c12(nm), it_pU_c13(nm) )
    allocate ( arq_numerico(nm) )
    allocate ( Tm_12(nm,nm-1), Um_12(nm,nm-1) )

    ! leitura dos nomes dos arquivos com resultados numéricos

    do i = 1, nm
       read(in,*) arq_numerico(i)
       pV(i) = pL + (i-1)*dpL
       write(pVt(i),1) pV(i)
       1 format(i2)
    end do

    read(in,*) title

	close(in)

    ! leitura da solução analítica exata
    if ( com_solucao_analitica == 1 ) then
       open(in,file=trim(adjustl(arq_exato)))
       do k = 1, variavel
          read(in,*) j, T_exato
       end do
       close(in)
    end if

    ! leitura dos resultados numéricos nas nm malhas
    do i = 1, nm
       open(in,file=trim(adjustl(arq_numerico(i))))
       read(in,*) h(i)
       do k = 1, variavel
          read(in,*) j, Th(i)
       end do
    end do
	close(in)

  end subroutine le_dados

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

  subroutine escreve_dados

    write(out,1) trim(adjustl(title)), dia, hora, variavel, arq_dados,  &
                 com_solucao_analitica, trim(adjustl(arq_exato)), T_exato, &
                 pL, dpl, nm, tipo_refino, numero_iteracoes, tol, pU_min, pU_max

    1 format(/, &
        3x, 'título = ', a,//, &
        3x, 'Dia = ',a12, 5x, 'Hora = ',a8, //, &
        i4, 19x, ' = número da variável, nos arquivos de resultados, a analisar', //, &
       'nome do arquivo de dados principal = ', a, /,  &
        i4, 19x, ' = com solução analítica?   1 = sim;   0 = não', /, &
       'nome do arquivo da solução analítica exata = ', a, /,  &
       1pe23.14, ' = solução analítica exata', //, &
        i4, 19x, ' = ordem assintótica do erro verdadeiro', /, &
        i4, 19x, ' = variação entre as ordens verdadeiras do erro verdadeiro', //, &
        i4, 19x, ' = número de malhas', //, &
        i4, 19x, ' = tipo de refino de malha (r): 1=constante; 2=variável', /, &
        i4, 19x, ' = número máximo de iterações para obter pU com r variável', /, &
       1pe23.14, ' = tolerância na obtenção de pU com r variável', /, &
       1pe23.14, ' = limite inferior de pU (r variável)', /, &
       1pe23.14, ' = limite superior de pU (r variável)')

       write(out,2)
       2 format (/, t4,'h', t27,'log10(h)', t40,'r21', t53,'arquivos com resultados numéricos:' )

       i = 1
       write(out,3) h(i), dlog10(h(i)), trim(adjustl(arq_numerico(i)))

       do i = 2, nm
          r21 = h(i-1) / h(i)
          write(out,4) h(i), dlog10(h(i)), r21, trim(adjustl(arq_numerico(i)))
       end do

       3 format(1pe23.14,1pe13.4,16x,a)

       4 format(1pe23.14,2(1pe13.4),3x,a)

  end subroutine escreve_dados

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

end module dados