module EXATO_CANAL

! sigla = EXATO_CANAL_

! objetivo: calcular a solução analítica do problema

! versão original 1.0 (28 Jan 00)

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

! versão atual    1.0 (28 Jan 00)

! última alteração =   31 Jan 00

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

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

  ! EXATO_CANAL_inicio_1
  ! EXATO_CANAL_le_dados
  ! EXATO_CANAL_le_inicio

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

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

  ! EXATO_CANAL_le_dados
  ! EXATO_CANAL_le_inicio

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

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

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

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

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

implicit none

real*8,private :: T_in  ! temperatura na entrada do canal (K)
real*8,private :: ro_in ! massa específica na entrada do canal (kg/m3)

real*8,private :: fm_t ! fluxo de massa em todos os canais (kg/s)

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

character*50,private :: nome_exato_canal ! nome do arquivo de dados do módulo EXATO_CANAL

logical,private :: dos ! acessa prompt dos

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

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

contains

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

  subroutine EXATO_CANAL_inicio_1 ( n, m, fm, sp, u, p, T, ro )

    integer,intent(in) :: n ! número total de volumes de controle + 2
    integer,intent(in) :: m ! número de canais em torno da tubeira

    real*8,dimension(:),intent(in) :: sp ! área da seção transversal do canal (m2)

    real*8,intent(out) :: fm ! fluxo de massa num único canal (kg/s)

    real*8,dimension(:),intent(inout) :: u  ! velocidade (m/s)
    real*8,dimension(:),intent(inout) :: p  ! pressão (Pa)
    real*8,dimension(:),intent(inout) :: T  ! temperatura (K)
    real*8,dimension(:),intent(inout) :: ro ! massa específica (kg/m3)

    fm = fm_t / m

    T = T_in

    p = 0.0d0

    ro = ro_in

    u = fm / ( ro * sp )
    u(1) = u(2)
    u(n) = u(n-1)

  end subroutine EXATO_CANAL_inicio_1

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

  subroutine EXATO_CANAL_le_dados ( unit )

    integer,intent(in) :: unit ! unidade de leitura do arquivo de dados

    open ( unit, file = trim(nome_exato_canal) )

    read ( unit, * ) T_in
    read ( unit, * ) ro_in
    read ( unit, * ) fm_t

    close ( unit )

  end subroutine EXATO_CANAL_le_dados 

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

  subroutine EXATO_CANAL_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_exato_canal 
    read ( unit, * ) lista
    read ( unit, * ) le
    read ( unit, * ) copia

    close ( unit )

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

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

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

  end subroutine EXATO_CANAL_le_inicio

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

end module EXATO_CANAL