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_4p0.in') ! lista arquivo
    open(in,file='Richardson_4p0.in')
    read(in,*) entrada         !Definição do Caso com base no valor de 'entrada'
    read(in,*) arq_dados       !Caso: um arquivo para cada malha
    read(in,*) arq_dados_unico !Caso: único arquivo para todas as malhas
	close(in)
	
    !-----------------------------------------------------------------------------------------------------
    !Entrada com diversos arquivos, sendo uma malha em cada arquivo
    !-----------------------------------------------------------------------------------------------------
    if(entrada==0) then
    
        ! 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,*) pL
        read(in,*) dpL
        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 ( T_MER(nm), pU_MER(nm), U_Ri_mpsi_MER(nm), U_Ri_p0(nm), U_Ri_pU(nm), &
                   psi_inter(nm), T_inf_p0(nm), T_inf_pU(nm), T_c(nm), U_c(nm),        &
                   U_GCI(nm), U_mc(nm), psi_v(nm),psi_c(nm),psi_i1(nm),psi_bi1(nm) )
        allocate ( h(nm), Th(nm), pV(nm), pVt(nm) )
        allocate ( Ti_12(nm), Ti_13(nm), Ti_23(nm), Ti_pU(nm),Ti_pU1(nm),  Tbi_pU(nm), &
                   Tbi_pU1(nm), Tc_12(nm), Tc_13(nm)  )
        allocate ( pU_h(nm),pU_h1(nm),  pU_i(nm), pU_i1(nm),  pU_bi(nm), pU_bi1(nm),   &
                   pU_c1(nm),  pU_c12(nm), pU_c13(nm)  )
        allocate ( Uri_12(nm), Uri_13(nm), Uri_23(nm), Uri_pU(nm),Uc_12(nm),   &
                   Uc_13(nm),Uri_p(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) )

        !Valoração inicial
        
        U_GCI = great
        pU_h1 = great
        pU_i1 = great
        pU_bi1 = great
        pU_c1 = great
        pU_MER = great
        U_Ri_pU = great
        psi_v = great 
        psi_c = great 
        psi_i1 = great 
        psi_bi1 = great
        psi_inter = great
        T_c = great
        U_c = great
        U_mc = great
        U_Ri_mpsi_MER = great

        ! 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(f5.2)
        end do

        read(in,*) title

	    close(in)

        ! 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 if
    
    !------------------------------------------------------------------------------------------------------
    !Entrada com um único arquivo, sendo que os resultados de todas as malhas estão em um único arquivo
    !-----------------------------------------------------------------------------------------------------
    if(entrada==1) then
    
        ! leitura dos dados principais
        note_caso = 'notepad ' // trim(adjustl(arq_dados_unico))
        dos = system( note_caso ) ! lista arquivo
        open(in,file=trim(adjustl(arq_dados_unico)))

        read(in,*) variavel
        read(in,*) caso
        read(in,*) pL
        read(in,*) dpL
        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 ( T_MER(nm), pU_MER(nm), U_Ri_mpsi_MER(nm), U_Ri_p0(nm), U_Ri_pU(nm), &
                   psi_inter(nm), T_inf_p0(nm), T_inf_pU(nm), T_c(nm), U_c(nm),        &
                   U_GCI(nm), U_mc(nm), psi_v(nm),psi_c(nm),psi_i1(nm),psi_bi1(nm) )
        allocate ( h(nm), Th(nm), pV(nm), pVt(nm) )
        allocate ( Ti_12(nm), Ti_13(nm), Ti_23(nm), Ti_pU(nm),Ti_pU1(nm),  Tbi_pU(nm), &
                   Tbi_pU1(nm), Tc_12(nm), Tc_13(nm)  )
        allocate ( pU_h(nm),pU_h1(nm),  pU_i(nm), pU_i1(nm),  pU_bi(nm), pU_bi1(nm),   &
                   pU_c1(nm),  pU_c12(nm), pU_c13(nm)  )
        allocate ( Uri_12(nm), Uri_13(nm), Uri_23(nm), Uri_pU(nm),Uc_12(nm),   &
                   Uc_13(nm),Uri_p(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(1) ) !unico arquivo contendo dados de todas as malhas
        allocate ( Tm_12(nm,nm-1), Um_12(nm,nm-1) )
        allocate (Th1(nm,variavel))

        !Valoração inicial
        
        U_GCI = great
        pU_h1 = great
        pU_i1 = great
        pU_bi1 = great
        pU_c1 = great
        pU_MER = great
        U_Ri_pU = great
        psi_v = great 
        psi_c = great
        psi_i1 = great 
        psi_bi1 = great
        psi_inter = great
        T_c = great
        U_c = great
        U_mc = great
        U_Ri_mpsi_MER = great
    
        ! leitura dos nomes dos arquivos com resultados numéricos
    
        do i = 1, nm
            pV(i) = pL + (i-1)*dpL
            write(pVt(i),2) pV(i)
            2 format(f5.2)
        end do
        
        read(in,*) arq_numerico(1)
        read(in,*) title

	    close(in)

        ! leitura dos resultados numéricos nas nm malhas em um arquivo único
        
        open(in,file=trim(adjustl(arq_numerico(1))))
        read(in,*)
        do i = 1, nm
           read(in,*) h(i), Th1(i,1:variavel) 
        end do
        Th(:) = Th1(:,variavel)

	    close(in)

    end if
  
  
  end subroutine le_dados

!------------------------------------------------------------------------------------------------------------
! Escrita dos dados lidos no arquivo de saída

  subroutine escreve_dados

    write(out,1) trim(adjustl(title)), dia, hora, variavel, arq_dados, pL, dpl, nm

    1 format(/, 'Listagem gerada pelo aplicativo RICHARDSON 4.0', //, &
        3x, 'título = ', a,//, &
        3x, 'Dia = ',a12, 5x, 'Hora = ',a8, //, &
        i4, ' = número da variável, nos arquivos de resultados, a analisar', //, &
       'nome do arquivo de dados principal = ', a, //, &
        f5.2, ' = ordem assintótica do erro verdadeiro', /, &
        f5.2, ' = variação entre as ordens verdadeiras do erro verdadeiro', //, &
        i4, ' = número de malhas' )

    if ( tipo_refino == 1 ) then 
       write(out,9)
       9 format (/, 'O refino de malha (r) é constante')
    else
       write(out,8) numero_iteracoes, tol, pU_min, pU_max
       8 format (/, 'O refino de malha (r) é variável', /, &
          i4, ' = número máximo de iterações para obter pU com r variável', /, &
          1pe13.4, ' = tolerância na obtenção de pU com r variável', /, &
          1pe13.4, ' = limite inferior de pU (r variável)', /, &
          1pe13.4, ' = limite superior de pU (r variável)')
    end if

       if(entrada==0) then
          write(out,2)
          2 format (/, t3,'h', t32,'log10(h)', t45,'r21', t58,'arquivos com resultados numéricos:' )
          i = 1
          write(out,3) h(i), qlog10(h(i)), trim(adjustl(arq_numerico(i)))
            do i = 2, nm
                r21 = h(i-1) / h(i)
                write(out,4) h(i), qlog10(h(i)), r21, trim(adjustl(arq_numerico(i)))
            end do
        end if
       
       if(entrada==1) then
          write(out,5)
          5 format (/, t3,'h', t32,'log10(h)', t45,'r21', t58,'arquivo único com resultados numéricos:' )
          i = 1
          write(out,3) h(i), qlog10(h(i)), trim(adjustl(arq_numerico(i)))
            do i = 2, nm
                r21 = h(i-1) / h(i)
                write(out,4) h(i), qlog10(h(i)), r21
            end do
       end if

       3 format(1pe28.20,1pe13.4,16x,a)

       4 format(1pe28.20,2(1pe13.4),3x,a)

  end subroutine escreve_dados

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

end module dados






