module TUBEIRA_PARABOLICA

! sigla = TUB_PAR_

! objetivo: gerar parâmetros geométricos da tubeira parabólica simétrica

! versão original 1.0 (28 Mai 99)

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

! versão atual    1.1 (12 Set 99)

! última alteração =   19 Jan 00

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

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

  ! TUB_PAR_calcula_raio
  ! TUB_PAR_calcula_X_R_faces
  ! TUB_PAR_calcula_X_R_nos
  ! TUB_PAR_le_dados
  ! TUB_PAR_le_inicio
  ! TUB_PAR_raio_curvatura

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

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

  ! TUB_PAR_le_dados
  ! TUB_PAR_le_inicio

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

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

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

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

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

implicit none

integer,private :: n  ! número total de volumes de controle reais + 2

integer,private :: i  ! número do volume ou face

real*8, private :: L  ! comprimento total da tubeira
real*8, private :: Ri ! raio na entrada da tubeira
real*8, private :: Rg ! raio na garganta da tubeira

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

character*50,private :: nome_tub_par ! nome do arquivo de dados do módulo TUBEIRA_PARABOLICA

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

contains

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

  subroutine TUB_PAR_calcula_raio ( x, r )

    real*8,dimension(:),intent(in)  :: x ! coordenada espacial

    real*8,dimension(:),intent(out) :: r ! raio
 
    r = rg + (ri-rg) * ( ( (2.0d0*x/L) - 1.0d0 ) ** 2 )

  end subroutine TUB_PAR_calcula_raio

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

  subroutine TUB_PAR_calcula_X_R_faces ( xp, xe, re )

    real*8,dimension(:),intent(in)  :: xp ! coordenada espacial no centro do volume de controle

    real*8,dimension(:),intent(out) :: xe ! coordenada espacial na face leste do volume de controle
    real*8,dimension(:),intent(out) :: re ! raio na face leste do volume de controle

    xe(1) = xp(1)

    do i = 2, n-2
      xe(i) = ( xp(i) + xp(i+1) ) / 2.0d0
    end do

    xe(n-1) = xp(n)

    call TUB_PAR_calcula_raio ( xe, re )

  end subroutine TUB_PAR_calcula_X_R_faces

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

  subroutine TUB_PAR_calcula_X_R_nos ( xp, rp )

    real*8,dimension(:),intent(out) :: xp ! coordenada espacial no centro do volume de controle
    real*8,dimension(:),intent(out) :: rp ! raio no centro do volume de controle

    real*8 :: dx ! auxiliar
 
    dx = L / ( n - 2 )

    xp(1) = 0.0d0

    do i = 2, n-1
      xp(i) = (i-1.5d0) * dx
    end do

    xp(n) = L

    call TUB_PAR_calcula_raio ( xp, rp )

  end subroutine TUB_PAR_calcula_X_R_nos

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

  subroutine TUB_PAR_le_dados ( unit )

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

    open ( unit, file = trim(nome_tub_par) )

    read ( unit, * ) n
    read ( unit, * ) L
    read ( unit, * ) Ri
    read ( unit, * ) Rg

    close ( unit )

  end subroutine TUB_PAR_le_dados

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

  subroutine TUB_PAR_le_inicio ( unit, nome, n_a )

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

    integer,intent(out) :: n_a ! número total de volumes de controle reais + 2

    open ( unit, file = trim(nome) )

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

    close ( unit )

    if ( lista == 1 ) call ARQUIVO_notepad_abre_dado ( nome_tub_par )

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

    if ( copia == 1 ) call ARQUIVO_copia_arquivo ( nome_tub_par )

    n_a = n

  end subroutine TUB_PAR_le_inicio

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

  subroutine TUB_PAR_raio_curvatura ( rc )

    real*8,intent(out) :: rc ! raio de curvatura na garganta da tubeira
 
    rc = ( L ** 2 ) / ( 8 * ( Ri - Rg ) )

  end subroutine TUB_PAR_raio_curvatura

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

end module TUBEIRA_PARABOLICA
