module PAREDE_DUTO

! sigla = PAREDE_DUTO_

! objetivo: gerar perfil e malha de um duto circular

! versão original 1.0 (30 Jan 00)

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

! versão atual    1.0 (30 Jan 00)

! última alteração =   17 Fev 00

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

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

  ! PAREDE_DUTO_calcula
  ! PAREDE_DUTO_le_dados
  ! PAREDE_DUTO_le_inicio
  ! PAREDE_DUTO_passa_dados
  ! PAREDE_DUTO_raio

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

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

  ! PAREDE_DUTO_le_dados
  ! PAREDE_DUTO_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 que definem o perfil do canal
                     ! inclui as duas extremidades do domínio

real*8, private :: r_in   ! raio do duto em x=0 (m)
real*8, private :: r_ex   ! raio do duto em x=L (m)
real*8, private :: l_duto ! comprimento do duto (m)

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

character*50,private :: nome_duto ! nome do arquivo de dados do módulo PAREDE_DUTO

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

contains

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

  subroutine PAREDE_DUTO_calcula ( ee, be, te )

    real*8,dimension(:),intent(out) :: ee ! espessura entre tubeira e canal (m)
    real*8,dimension(:),intent(out) :: be ! altura do canal (m)
    real*8,dimension(:),intent(out) :: te ! espessura das aletas do canal (m)

    ee = 0.0d0
    be = 0.0d0
    te = 0.0d0

  end subroutine PAREDE_DUTO_calcula

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

  subroutine PAREDE_DUTO_le_dados ( unit )

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

    open ( unit, file = trim(nome_duto) )

    read ( unit, * ) n
    read ( unit, * ) r_in
    read ( unit, * ) r_ex
    read ( unit, * ) l_duto

    close ( unit )

  end subroutine PAREDE_DUTO_le_dados

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

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

    close ( unit )

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

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

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

  end subroutine PAREDE_DUTO_le_inicio

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

  subroutine PAREDE_DUTO_passa_dados ( n_p )

    integer :: n_p ! número total de volumes de controle que definem o perfil do canal

    n_p = n

  end subroutine PAREDE_DUTO_passa_dados

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

  subroutine PAREDE_DUTO_raio ( xe, xp, re )

    real*8,dimension(:),intent(inout)  :: xe ! coordenada espacial (m)
    real*8,dimension(:),intent(inout)  :: xp ! coordenada espacial (m)
    real*8,dimension(:),intent(inout)  :: re ! raio da tubeira (m)
  
    integer :: i  ! índice de um ponto específico
    
	real*8 :: dx, fator
 
    dx = l_duto / ( n - 2 )

    xp(1) = 0.0d0
    do i = 2, n-1
      xp(i) = (i-1.5d0) * dx
    end do
    xp(n) = l_duto
    
    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)

    re(1)   = r_in
    re(n-1) = r_ex
    do i = 2, n-2
       fator = ( xe(i) - xe(1) ) / ( xe(n-1) - xe(1) )
       re(i) = re(1) + ( re(n-1) - re(1) ) * fator
    end do

  end subroutine PAREDE_DUTO_raio

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

end module PAREDE_DUTO
