module TUBEIRA_COS_CAMARA

! sigla = TUB_COS_CAM_

! objetivo: gerar parâmetros geométricos da tubeira cossenoidal simétrica com câmara

! versão original 1.0 (20 Jan 00)

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

! versão atual    1.0 (20 Jan 00)

! última alteração =   20 Jan 00

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

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

  ! TUB_COS_CAM_calcula_raio
  ! TUB_COS_CAM_calcula_X_R_faces
  ! TUB_COS_CAM_calcula_X_R_nos
  ! TUB_COS_CAM_le_dados
  ! TUB_COS_CAM_le_inicio
  ! TUB_COS_CAM_raio_curvatura

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

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

  ! TUB_COS_CAM_le_dados
  ! TUB_COS_CAM_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 :: Lc ! comprimento da câmara (m)
real*8, private :: Ln ! comprimento da tubeira (m)
real*8, private :: L  ! comprimento total: câmara + tubeira (m)
real*8, private :: ri ! raio na entrada da tubeira (m)
real*8, private :: rg ! raio na garganta da tubeira (m)
real*8, private :: d  ! amplitude da cossenóide (m)

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

character*50,private :: nome_tub_cos_cam ! nome do arquivo de dados do módulo TUBEIRA_COS_CAMARA

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

contains

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

  subroutine TUB_COS_CAM_calcula_raio ( nf, x, r )

    integer,intent(in) :: nf ! número do ponto final

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

    real*8,dimension(:),intent(out) :: r ! raio

    real*8 :: pi ! constante matemática

    pi = dacos(-1.0d0)

    do i = 1, nf

       if ( x(i) <= Lc ) r(i) = ri

       if ( x(i) >= Lc ) &
          r(i) = rg + d * ( 1.0d0 + cos ( 2.0d0*pi*(x(i)-Lc) / Ln ) )

    end do

  end subroutine TUB_COS_CAM_calcula_raio

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

  subroutine TUB_COS_CAM_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_COS_CAM_calcula_raio ( n-1, xe, re )

  end subroutine TUB_COS_CAM_calcula_X_R_faces

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

  subroutine TUB_COS_CAM_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_COS_CAM_calcula_raio ( n, xp, rp )

  end subroutine TUB_COS_CAM_calcula_X_R_nos

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

  subroutine TUB_COS_CAM_le_dados ( unit )

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

    open ( unit, file = trim(nome_tub_cos_cam) )

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

    close ( unit )

    Ln = L - Lc

    d = ( ri - rg ) / 2

  end subroutine TUB_COS_CAM_le_dados

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

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

    close ( unit )

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

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

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

    n_a = n

  end subroutine TUB_COS_CAM_le_inicio

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

  subroutine TUB_COS_CAM_raio_curvatura ( rc )

    real*8,intent(out) :: rc ! raio de curvatura na garganta da tubeira

    real*8 :: pi ! constante matemática

    pi = dacos(-1.0d0)
 
    rc = ( Ln ** 2 ) / ( 2.0d0 * (pi**2) * ( ri - rg ) )

  end subroutine TUB_COS_CAM_raio_curvatura

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

end module TUBEIRA_COS_CAMARA
