module NUMERICO_GERAL

! sigla = NUM_GER_

! objetivo: gerenciar o cálculo da solução numérica do modelo matemático

! 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 =   11 Abr 00

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

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

  ! NUM_GER_abre_iteracoes
  ! NUM_GER_abre_outros
  ! NUM_GER_executa
  ! NUM_GER_le_dados
  ! NUM_GER_le_inicio

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

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

  ! NUM_GER_le_dados
  ! NUM_GER_le_inicio

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

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

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

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

use NUMERICO_CONSTANTE ! versão 1.0 (11 Abr 00)

use NUMERICO_VARIAVEL  ! versão 1.0 (11 Abr 00)

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

implicit none

integer,private :: beta          ! 0=UDS; 1=CDS
integer,private :: nitm          ! número máximo de iterações no tempo
integer,private :: w_it          ! freqüência de escrita de parâmetros ao longo das iterações
integer,private :: lista_itera   ! lista solução iterativa
integer,private :: w_aux         ! freqüência de escrita de campos auxiliares
integer,private :: lista_aux     ! lista arquivo com os campos auxiliares (1); 0=não
integer,private :: tipo_ci       ! tipo de condição inicial: 1=analítica; 2=reinício

real*8, private :: dt            ! intervalo de tempo (s)

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

character*50,private  :: nome_ci      ! nome do arquivo de dados de reinício

character*50,private  :: nome_num_ger ! nome do arquivo de dados do módulo NUMERICO_GERAL

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

logical,private       :: dos          ! acessa prompt dos

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

contains

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

  subroutine NUM_GER_abre_iteracoes

    character*(150) :: trabalho ! nome do diretório para saídas
    character*(50)  :: caso     ! nome do caso

    if ( lista_itera == 0 ) return

    call ARQUIVO_passa_diretorio_trabalho ( trabalho )
    call ARQUIVO_passa_caso ( caso )
    comando = 'notepad '// trim(trabalho) // &
              trim(caso) // '.canal.itn'
    dos = systemqq ( comando )

  end subroutine NUM_GER_abre_iteracoes

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

  subroutine NUM_GER_abre_outros

    character*(150) :: trabalho ! nome do diretório para saídas
    character*(50)  :: caso     ! nome do caso

    if ( lista_aux == 0 ) return

    call ARQUIVO_passa_diretorio_trabalho ( trabalho )
    call ARQUIVO_passa_caso ( caso )
    comando = 'notepad '// trim(trabalho) // &
              trim(caso) // '.canal.outros.txt'
    dos = systemqq ( comando )

  end subroutine NUM_GER_abre_outros

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

  subroutine NUM_GER_executa ( unit,  n,   m,   modelo, nome_inicio, xe,  xp, se,  sp, dp,    &
                               le,    sbp, sap, tp,     re,          ep,  ee, bp,  fm, r_qwc, &
                               q_sai, u,   p,   T,      ro,          itg, itgmax              )

    integer,intent(in) :: unit    ! unidade de leitura do arquivo de dados
    integer,intent(in) :: n       ! número de volumes de controle com dois fictícios
    integer,intent(in) :: m       ! número de canais em torno da tubeira
    integer,intent(in) :: modelo  ! 2=numérico c/props.constantes; 3=numérico c/props.variáveis 

    character*(*),intent(in) :: nome_inicio ! nome do arquivo de dados de inicialização

    real*8,dimension(:),intent(in) :: xe  ! coordenada espacial na face leste do volume de controle
    real*8,dimension(:),intent(in) :: xp  ! coordenada espacial no centro do volume de controle
    real*8,dimension(:),intent(in) :: se  ! área na face leste do volume de controle
    real*8,dimension(:),intent(in) :: sp  ! área no centro do volume de controle
    real*8,dimension(:),intent(in) :: dp  ! diâmetro hidráulico da seção transversal do canal (m)
    real*8,dimension(:),intent(in) :: le  ! comprimento médio do escoamento no canal (m)
    real*8,dimension(:),intent(in) :: sbp ! área da base do canal (m2)
    real*8,dimension(:),intent(in) :: sap ! área molhada das aletas do canal (m2)
    real*8,dimension(:),intent(in) :: tp  ! espessura das aletas do canal (m)
    real*8,dimension(:),intent(in) :: re  ! raio da tubeira (m)
    real*8,dimension(:),intent(in) :: ep  ! espessura entre tubeira e canal (m)
    real*8,dimension(:),intent(in) :: ee  ! espessura entre tubeira e canal (m)
    real*8,dimension(:),intent(in) :: bp  ! altura do canal (m)

    real*8,intent(out) :: fm     ! fluxo de massa num único canal (kg/s)
    real*8,intent(out) :: r_qwc  ! razão q_wall / q_sai
    real*8,intent(out) :: q_sai  ! taxa de transferência de calor advectivo na saída do canal (W)

    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)

    integer,intent(inout) :: itg    ! número da iteração global corrente entre MACH1D e CANAL
    integer,intent(inout) :: itgmax ! número da iteração global máxima entre MACH1D e CANAL a realizar

    select case ( modelo )

       case ( 2 )
          call NUM_CTE_le_inicio ( unit, nome_inicio )
          call NUM_CTE_executa ( n,   m,   w_it, beta,  nitm,  w_aux, lista_aux, &
                                 dt,  xe,  xp,   se,    sp,    dp,    le,        &
                                 sbp, sap, fm,   r_qwc, q_sai, u,     p,         &
                                 T,   ro   )

       case ( 3 )
          call NUM_VAR_le_inicio ( unit, nome_inicio )
          call NUM_VAR_executa ( n,         m,       w_it, beta,  nitm,  tipo_ci, w_aux,  &
                                 lista_aux, nome_ci, dt,   xe,    xp,    se,      sp,     &
                                 dp,        le,      sbp,  sap,   tp,    re,      ep,     &
                                 ee,        bp,      fm,   r_qwc, q_sai, u,       p,      &
                                 T,         ro,      itg,  itgmax )

    end select

    if ( itg == itgmax ) then
       call NUM_GER_abre_iteracoes
       call NUM_GER_abre_outros
    end if

  end subroutine NUM_GER_executa 

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

  subroutine NUM_GER_le_dados ( unit )

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

    open ( unit, file = trim(nome_num_ger) )

    read ( unit, * ) beta
    read ( unit, * ) dt
    read ( unit, * ) nitm
    read ( unit, * ) tipo_ci
    read ( unit, * ) nome_ci
    read ( unit, * ) w_it
    read ( unit, * ) lista_itera
    read ( unit, * ) w_aux
    read ( unit, * ) lista_aux

    close ( unit )

  end subroutine NUM_GER_le_dados 

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

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

    close ( unit )

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

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

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

  end subroutine NUM_GER_le_inicio

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

end module NUMERICO_GERAL