module MACH1D_GERAL

! sigla = MACH1D_GER_

! objetivo: resolver o Escoamento Quase-Unidimensional de 
!           Fluido Compressível Viscoso com Troca de Calor
!           e escoamento reativo

! Versão original 1.0 (Jul 1989)

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

! Versão atual    5.0 (24 Jun 05)

! última alteração =   27 Fev 06

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

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

  ! MACH1D_GER_empuxo
  ! MACH1D_GER_escreve_texto
  ! MACH1D_GER_executa
  ! MACH1D_GER_graficos
  ! MACH1D_GER_le_dados
  ! MACH1D_GER_le_inicio
  ! MACH1D_GER_le_tubeira
  ! MACH1D_GER_propulsao
  ! MACH1D_GER_saida_rex

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

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

  ! MACH1D_GER_le_dados
  ! MACH1D_GER_le_inicio
  ! MACH1D_GER_le_tubeira

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

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

  ! MACH1D_GER_executa
  ! MACH1D_GER_saida_rex

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

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

use EXATO_MACH     ! versão 1.1 (14 Fev 00)

use MACH1D_NOMES   ! ( 9 Nov 05)

use NUMERICO_GERAL ! versão 1.0 (27 Fev 06)

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

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

implicit none

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

contains

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

  subroutine MACH1D_GER_empuxo ( fm, u, Fd )

    real*8,intent(in) :: fm ! fluxo de massa (kg/s)

    real*8,dimension(:),intent(in)  :: u  ! velocidade (m/s)

    real*8,dimension(:),intent(out) :: Fd ! empuxo dinâmico (N)

    Fd = fm * u

  end subroutine MACH1D_GER_empuxo

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

  subroutine MACH1D_GER_escreve_texto

    call ARQUIVO_escreve_campo_1D ( unit_main,       & ! unidade de arquivo para escrever
                            w_M,                     & ! freqüência de escrita
                            '*** número de Mach ***                             ', & ! 50 colunas
                            ' ponto',                & !  6 colunas
                            'x (m)                ', & ! 21 colunas
                            'M (adimensional)     ', & ! 21 colunas
                            1,                       & ! número do ponto inicial
                            n,                       & ! número de dados a escrever
                            xp,                      & ! coordenada espacial
                            M                        ) ! variável a escrever


    call ARQUIVO_escreve_campo_1D ( unit_main,       & ! unidade de arquivo para escrever
                            w_p,                     & ! freqüência de escrita
                            '*** pressão ***                                    ', & ! 50 colunas
                            ' ponto',                & !  6 colunas
                            'x (m)                ', & ! 21 colunas
                            'p (Pa)               ', & ! 21 colunas
                            1,                       & ! número do ponto inicial
                            n,                       & ! número de dados a escrever
                            xp,                      & ! coordenada espacial
                            p                        ) ! variável a escrever


    call ARQUIVO_escreve_campo_1D ( unit_main,       & ! unidade de arquivo para escrever
                            w_T,                     & ! freqüência de escrita
                            '*** temperatura ***                                ', & ! 50 colunas
                            ' ponto',                & !  6 colunas
                            'x (m)                ', & ! 21 colunas
                            'T (K)                ', & ! 21 colunas
                            1,                       & ! número do ponto inicial
                            n,                       & ! número de dados a escrever
                            xp,                      & ! coordenada espacial
                            T                        ) ! variável a escrever


    call ARQUIVO_escreve_campo_1D ( unit_main,       & ! unidade de arquivo para escrever
                            w_u,                     & ! freqüência de escrita
                            '*** velocidade nodal ***                           ', & ! 50 colunas
                            ' ponto',                & !  6 colunas
                            'x (m)                ', & ! 21 colunas
                            'u (m/s)              ', & ! 21 colunas
                            1,                       & ! número do ponto inicial
                            n,                       & ! número de dados a escrever
                            xp,                      & ! coordenada espacial
                            u                        ) ! variável a escrever


    call ARQUIVO_escreve_campo_1D ( unit_main,       & ! unidade de arquivo para escrever
                            w_ro,                    & ! freqüência de escrita
                            '*** massa específica ***                           ', & ! 50 colunas
                            ' ponto',                & !  6 colunas
                            'x (m)                ', & ! 21 colunas
                            'ro (kg/m3)           ', & ! 21 colunas
                            1,                       & ! número do ponto inicial
                            n,                       & ! número de dados a escrever
                            xp,                      & ! coordenada espacial
                            ro                       ) ! variável a escrever

    call ARQUIVO_escreve_campo_1D ( unit_main,       & ! unidade de arquivo para escrever
                            w_Fd,                    & ! freqüência de escrita
                            '*** empuxo dinâmico ***                            ', & ! 50 colunas
                            ' ponto',                & !  6 colunas
                            'x (m)                ', & ! 21 colunas
                            'Fd (N)               ', & ! 21 colunas
                            1,                       & ! número do ponto inicial
                            n,                       & ! número de dados a escrever
                            xp,                      & ! coordenada espacial
                            Fd                       ) ! variável a escrever

    call ARQUIVO_escreve_campo_1D ( unit_main,       & ! unidade de arquivo para escrever
                            w_p_tot,                 & ! freqüência de escrita
                            '*** pressão de estagnação ***                      ', & ! 50 colunas
                            ' ponto',                & !  6 colunas
                            'x (m)                ', & ! 21 colunas
                            'p_estagnação (Pa)    ', & ! 21 colunas
                            1,                       & ! número do ponto inicial
                            n,                       & ! número de dados a escrever
                            xp,                      & ! coordenada espacial
                            p_tot                    ) ! variável a escrever

    call ARQUIVO_escreve_campo_1D ( unit_main,       & ! unidade de arquivo para escrever
                            w_T_tot,                 & ! freqüência de escrita
                            '*** temperatura de estagnação ***                  ', & ! 50 colunas
                            ' ponto',                & !  6 colunas
                            'x (m)                ', & ! 21 colunas
                            'T_estagnação (K)     ', & ! 21 colunas
                            1,                       & ! número do ponto inicial
                            n,                       & ! número de dados a escrever
                            xp,                      & ! coordenada espacial
                            T_tot                    ) ! variável a escrever

  end subroutine MACH1D_GER_escreve_texto 

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

  subroutine MACH1D_GER_executa

    ! lê dados de inicialização do programa MACH1D
    call MACH1D_GER_le_inicio ( unit_aux, inicio )

    ! dados do módulo ARQUIVO
    call ARQUIVO_le_inicio ( unit_aux, arquivo_nome_inicio_modulo )
    call ARQUIVO_passa_caso ( nome_caso )

    ! dados do módulo MACH1D_GERAL
    if ( lista_mach1d_ger == 1 ) call ARQUIVO_notepad_abre_dado ( nome_mach1d_ger )
    if ( le_mach1d_ger    == 1 ) call MACH1D_GER_le_dados ( unit_aux, nome_mach1d_ger )
    if ( copia_mach1d_ger == 1 ) call ARQUIVO_copia_arquivo ( nome_mach1d_ger )

    ! dados da tubeira
    call MACH1D_GER_le_tubeira
!    call ARQUIVO_copia_arquivo ( nome_tubeira )

    ! dados do módulo EXATO_MACH
    call EXATO_MACH_le_inicio ( unit_aux, exato_mach_nome_inicio_modulo )
    call EXATO_MACH_passa_dados ( gama, Rg, p_cam, T_cam, g )

    ! *** ALOCAÇÃO DE MEMÓRIA ***
    allocate ( M(n), p(n), T(n), u(n), ro(n) )
    allocate ( p_tot(n), T_tot(n) )
    allocate ( Fd(n) )

    ! solução analítica do problema de MACH e 
    ! condição inicial do modelo numérico

    call EXATO_MACH_fluxo_massa ( gama, Rg, p_cam, T_cam, Sg, fm_exato )
    fm = fm_exato

    call EXATO_MACH_Mach ( n, ng, gama, sp/sg, M )

    call EXATO_MACH_pressao ( n, gama, p_cam, M, p )

    call EXATO_MACH_temperatura ( n, gama, T_cam, M, T )

    call EXATO_MACH_abre_Newton_M

    call EXATO_MACH_u_Mach ( gama, Rg, M, T, u )

    call EXATO_MACH_massa_especifica ( Rg, p, T, ro )

    call MACH1D_GER_empuxo ( fm, u, Fd )
    F_exato = Fd(n)
    F_ex    = F_exato
    F_g     = p_cam * Sg

    call MACH1D_GER_propulsao ( fm_exato,     F_exato,  g,        F_g, &
                                c_star_exato, Cf_exato, Isp_exato )
    
    call EXATO_MACH_p_tot ( n, gama, M, p, p_tot )
    call EXATO_MACH_T_tot ( n, gama, M, T, T_tot )

    ! solução numérica com propriedades constantes

    if ( modelo == 2 ) then

       call NUM_GER_le_inicio ( unit_aux, num_ger_nome_inicio_modulo )
       call NUM_GER_executa ( unit_aux, n,  modelo, fm_exato, F_exato, num_cte_nome_inicio_modulo, &
                              rc,       Sg, xe,     xp,       rp,      se,                         &
                              sp,       sn, fm,     F_ex,     r_qwh,   q_sai,                      &
                              u,        p,  T,      ro,       M,       p_tot,            T_tot,    &
                              itg,      itgmax      )
       call NUM_CTE_passa_dados ( gama, Rg, p_cam, T_cam )
       call MACH1D_GER_empuxo ( fm, u, Fd )
       call EXATO_MACH_Mach_u ( gama, Rg, u, T, M )

       call MACH1D_GER_propulsao ( fm, F_ex, g, F_g, c_star, Cf, Isp )

       call EXATO_MACH_p_tot ( n, gama, M, p, p_tot )
       call EXATO_MACH_T_tot ( n, gama, M, T, T_tot )

    end if 

    ! solução numérica com propriedades variáveis

    if ( modelo == 3 ) then

       call NUM_GER_le_inicio ( unit_aux, num_ger_nome_inicio_modulo )
       call NUM_GER_executa ( unit_aux, n,  modelo, fm_exato, F_exato, num_var_nome_inicio_modulo, &
                              rc,       Sg, xe,     xp,       rp,      se,                         &
                              sp,       sn, fm,     F_ex,     r_qwh,   q_sai,                      &
                              u,        p,  T,      ro,       M,       p_tot,            T_tot,    &
                              itg,      itgmax      )
       call MACH1D_GER_empuxo ( fm, u, Fd )

       call MACH1D_GER_propulsao ( fm, F_ex, g, F_g, c_star, Cf, Isp )

    end if 

    ! solução numérica com propriedades variáveis e escoamento congelado

    if ( modelo == 4 ) then

       call NUM_GER_le_inicio ( unit_aux, num_ger_nome_inicio_modulo )
       call NUM_GER_executa ( unit_aux, n,  modelo, fm_exato, F_exato, num_cong_nome_inicio_modulo, &
                              rc,       Sg, xe,     xp,       rp,      se,                          &
                              sp,       sn, fm,     F_ex,     r_qwh,   q_sai,                       &
                              u,        p,  T,      ro,       M,       p_tot,            T_tot,     &
                              itg,      itgmax      )
       call MACH1D_GER_empuxo ( fm, u, Fd )

       call MACH1D_GER_propulsao ( fm, F_ex, g, F_g, c_star, Cf, Isp )

    end if 

    ! solução numérica com propriedades variáveis e escoamento em equilíbrio químico local

    if ( modelo == 5 ) then

       call NUM_GER_le_inicio ( unit_aux, num_ger_nome_inicio_modulo )
       call NUM_GER_executa ( unit_aux, n,  modelo, fm_exato, F_exato, num_eq_nome_inicio_modulo, &
                              rc,       Sg, xe,     xp,       rp,      se,                         &
                              sp,       sn, fm,     F_ex,     r_qwh,   q_sai,                      &
                              u,        p,  T,      ro,       M,       p_tot,            T_tot,    &
                              itg,      itgmax      )
       call MACH1D_GER_empuxo ( fm, u, Fd )

       call MACH1D_GER_propulsao ( fm, F_ex, g, F_g, c_star, Cf, Isp )

    end if 

    ! solução numérica com propriedades variáveis e escoamento com taxa finita de reação

    if ( modelo == 6 ) then

       call NUM_GER_le_inicio ( unit_aux, num_ger_nome_inicio_modulo )
       call NUM_GER_executa ( unit_aux, n,  modelo, fm_exato, F_exato, num_tf_nome_inicio_modulo, &
                              rc,       Sg, xe,     xp,       rp,      se,                         &
                              sp,       sn, fm,     F_ex,     r_qwh,   q_sai,                      &
                              u,        p,  T,      ro,       M,       p_tot,            T_tot,    &
                              itg,      itgmax      )
       call MACH1D_GER_empuxo ( fm, u, Fd )

       call MACH1D_GER_propulsao ( fm, F_ex, g, F_g, c_star, Cf, Isp )

    end if 

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

    ! *** GERAÇÃO DOS ARQUIVOS DE SAÍDA ***

    if ( w_lista == 1 .and. itg == itgmax ) then
   
       call ARQUIVO_cria_arquivo ( unit_main, trim(nome_caso)//'.mach1d.txt' )

       write ( unit_main, 1 ) titulo
       1 format ( /, t5, a100, // )

       call ARQUIVO_escreve_data_hora ( unit_main )

       write(unit_main,2) fm_exato, F_exato,  F_g, F_exato/fm_exato, c_star_exato, &
                          Cf_exato, Isp_exato
       2 format(/,1x,'*** Solução analítica do escoamento Q1D isentrópico ***',//,  &
                  1pe25.15,' = fluxo de massa (kg/s)',/,                    &
                  1pe25.15,' = empuxo na saída da tubeira (N)',/,           &
                  1pe25.15,' = empuxo padrão (N)',/,                        &
                  1pe25.15,' = velocidade de ejeção dos gases (m/s)',/,     &
                  1pe25.15,' = velocidade característica (m/s)',/,          &
                  1pe25.15,' = coeficiente de empuxo (adimensional)',/,     &
                  1pe25.15,' = impulso específico (s)')

       if ( modelo >= 2 ) then
          write(unit_main,3) fm/fm_exato,                F_ex/F_exato,        &
                             F_ex*fm_exato/(fm*F_exato), c_star/c_star_exato, &
                             Cf/Cf_exato,                Isp/Isp_exato
          3 format(/,1x,'*** Eficiências: numérico / solução analítica ***',//, &
                     1pe25.15,' = coeficiente de descarga',/, &
                     1pe25.15,' = empuxo',/, &
                     1pe25.15,' = velocidade de ejeção dos gases',/, &
                     1pe25.15,' = velocidade característica (m/s)',/, &
                     1pe25.15,' = coeficiente de empuxo',/, &
                     1pe25.15,' = impulso específico')

          write(unit_main,4) q_sai, r_qwh
          4 format(/,1pe25.15,' = taxa de transferência de calor advectivo na saída da tubeira (W)',/, &
                     1pe25.15,' = razão q_wall / q_advectivo na saída da tubeira',/)

       end if  

       call MACH1D_GER_escreve_texto

       close ( unit_main )

       if ( lista_caso == 1 ) &
          call ARQUIVO_notepad_abre_saida ( unit_aux, trim(nome_caso)//'.mach1d.txt' )

    end if

    if ( itg == itgmax .and. itg == 1 ) &
       call MACH1D_GER_saida_rex ( unit_aux, fm/fm_exato, F_ex/F_exato, r_qwh )

    if ( itg == itgmax ) then

       if ( lista_rex == 1 ) &
          call ARQUIVO_notepad_abre_dado ( trim(nome_caso)//'.mach1d.num' )

       if ( w_grafico /= 0 ) call MACH1D_GER_graficos

    end if

  end subroutine MACH1D_GER_executa

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

  subroutine MACH1D_GER_graficos

    call PLOTA_copia_Wgnuplot

    ! dados do módulo PLOTA: nomes dos casos a plotar (sem as extensões)
    call PLOTA_le_inicio ( unit_aux, plota_nome_inicio_modulo )

    ! gráfico do número de Mach

    if ( g_M == 1 ) then
       call ARQUIVO_grava_campo_1D ( unit_aux,             & ! unidade de arquivo para escrever
                             trim(nome_caso)//'.Mach.dat', & ! nome do arquivo
                             w_M,                          & ! freqüência de escrita
                             1,                            & ! número do ponto inicial
                             n,                            & ! número de dados a escrever
                             xp,                           & ! dados da coluna 1
                             M                             ) ! dados da coluna 2
    end if

    if ( g_M == 2 ) then
       call ARQUIVO_grava_campo_e_tubeira ( unit_aux,      & ! unidade de arquivo para escrever
                             trim(nome_caso)//'.Mach.dat', & ! nome do arquivo a gravar
                             w_M,                          & ! freqüência de escrita
                             1,                            & ! número do ponto inicial do campo
                             n,                            & ! número do ponto final do campo
                             xp,                           & ! dados da coluna 1
                             M,                            & ! dados da coluna 2
                             xe,                           & ! coordenada espacial da face da tubeira
                             re                            ) ! raio da face da tubeira
    end if

    if ( g_M == 1 .or. g_M == 2 ) then
       call PLOTA_gera_nomes ( unit_aux, '.Mach.dat' )
       call PLOTA_le_dados_gnu (  unit_aux, 'mach1d.Mach.grafico.ent' )
       call PLOTA_gera_gnu ( unit_aux, trim(nome_caso)//'.Mach.grafico.gnu' )
       call PLOTA_executa_Wgnuplot ( unit_aux, trim(nome_caso)//'.Mach.grafico.gnu' )
    end if

    ! gráfico da pressão

    if ( g_p == 1 ) then
       call ARQUIVO_grava_campo_1D ( unit_aux,             & ! unidade de arquivo para escrever
                             trim(nome_caso)//'.pressao.dat', & ! nome do arquivo
                             w_p,                          & ! freqüência de escrita
                             1,                            & ! número do ponto inicial
                             n,                            & ! número de dados a escrever
                             xp,                           & ! dados da coluna 1
                             p                             ) ! dados da coluna 2
    end if

    if ( g_p == 2 ) then
       call ARQUIVO_grava_campo_e_tubeira ( unit_aux,      & ! unidade de arquivo para escrever
                             trim(nome_caso)//'.pressao.dat', & ! nome do arquivo a gravar
                             w_p,                          & ! freqüência de escrita
                             1,                            & ! número do ponto inicial do campo
                             n,                            & ! número do ponto final do campo
                             xp,                           & ! dados da coluna 1
                             p,                            & ! dados da coluna 2
                             xe,                           & ! coordenada espacial da face da tubeira
                             re                            ) ! raio da face da tubeira
    end if

    if ( g_p == 1 .or. g_p == 2 ) then
       call PLOTA_gera_nomes ( unit_aux, '.pressao.dat' )
       call PLOTA_le_dados_gnu (  unit_aux, 'mach1d.pressao.grafico.ent' )
       call PLOTA_gera_gnu ( unit_aux, trim(nome_caso)//'.pressao.grafico.gnu' )
       call PLOTA_executa_Wgnuplot ( unit_aux, trim(nome_caso)//'.pressao.grafico.gnu' )
    end if

    ! gráfico da temperatura

    if ( g_T == 1 ) then
       call ARQUIVO_grava_campo_1D ( unit_aux,             & ! unidade de arquivo para escrever
                             trim(nome_caso)//'.temperatura.dat', & ! nome do arquivo
                             w_T,                          & ! freqüência de escrita
                             1,                            & ! número do ponto inicial
                             n,                            & ! número de dados a escrever
                             xp,                           & ! dados da coluna 1
                             T                             ) ! dados da coluna 2
    end if

    if ( g_T == 2 ) then
       call ARQUIVO_grava_campo_e_tubeira ( unit_aux,      & ! unidade de arquivo para escrever
                             trim(nome_caso)//'.temperatura.dat', & ! nome do arquivo a gravar
                             w_T,                          & ! freqüência de escrita
                             1,                            & ! número do ponto inicial do campo
                             n,                            & ! número do ponto final do campo
                             xp,                           & ! dados da coluna 1
                             T,                            & ! dados da coluna 2
                             xe,                           & ! coordenada espacial da face da tubeira
                             re                            ) ! raio da face da tubeira
    end if

    if ( g_T == 1 .or. g_T == 2 ) then
       call PLOTA_gera_nomes ( unit_aux, '.temperatura.dat' )
       call PLOTA_le_dados_gnu (  unit_aux, 'mach1d.temperatura.grafico.ent' )
       call PLOTA_gera_gnu ( unit_aux, trim(nome_caso)//'.temperatura.grafico.gnu' )
       call PLOTA_executa_Wgnuplot ( unit_aux, trim(nome_caso)//'.temperatura.grafico.gnu' )
    end if

    ! gráfico da velocidade

    if ( g_u == 1 ) then
       call ARQUIVO_grava_campo_1D ( unit_aux,             & ! unidade de arquivo para escrever
                             trim(nome_caso)//'.velocidade.dat', & ! nome do arquivo
                             w_u,                          & ! freqüência de escrita
                             1,                            & ! número do ponto inicial
                             n,                            & ! número de dados a escrever
                             xp,                           & ! dados da coluna 1
                             u                             ) ! dados da coluna 2
    end if

    if ( g_u == 2 ) then
       call ARQUIVO_grava_campo_e_tubeira ( unit_aux,      & ! unidade de arquivo para escrever
                             trim(nome_caso)//'.velocidade.dat', & ! nome do arquivo a gravar
                             w_u,                          & ! freqüência de escrita
                             1,                            & ! número do ponto inicial do campo
                             n,                            & ! número do ponto final do campo
                             xp,                           & ! dados da coluna 1
                             u,                            & ! dados da coluna 2
                             xe,                           & ! coordenada espacial da face da tubeira
                             re                            ) ! raio da face da tubeira
    end if

    if ( g_u == 1 .or. g_u == 2 ) then
       call PLOTA_gera_nomes ( unit_aux, '.velocidade.dat' )
       call PLOTA_le_dados_gnu (  unit_aux, 'mach1d.velocidade.grafico.ent' )
       call PLOTA_gera_gnu ( unit_aux, trim(nome_caso)//'.velocidade.grafico.gnu' )
       call PLOTA_executa_Wgnuplot ( unit_aux, trim(nome_caso)//'.velocidade.grafico.gnu' )
    end if

    ! gráfico da massa_especifica

    if ( g_ro == 1 ) then
       call ARQUIVO_grava_campo_1D ( unit_aux,             & ! unidade de arquivo para escrever
                             trim(nome_caso)//'.massa_especifica.dat', & ! nome do arquivo
                             w_ro,                          & ! freqüência de escrita
                             1,                            & ! número do ponto inicial
                             n,                            & ! número de dados a escrever
                             xp,                           & ! dados da coluna 1
                             ro                             ) ! dados da coluna 2
    end if

    if ( g_ro == 2 ) then
       call ARQUIVO_grava_campo_e_tubeira ( unit_aux,      & ! unidade de arquivo para escrever
                             trim(nome_caso)//'.massa_especifica.dat', & ! nome do arquivo a gravar
                             w_ro,                         & ! freqüência de escrita
                             1,                            & ! número do ponto inicial do campo
                             n,                            & ! número do ponto final do campo
                             xp,                           & ! dados da coluna 1
                             ro,                           & ! dados da coluna 2
                             xe,                           & ! coordenada espacial da face da tubeira
                             re                            ) ! raio da face da tubeira
    end if

    if ( g_ro == 1 .or. g_ro == 2 ) then
       call PLOTA_gera_nomes ( unit_aux, '.massa_especifica.dat' )
       call PLOTA_le_dados_gnu (  unit_aux, 'mach1d.massa_especifica.grafico.ent' )
       call PLOTA_gera_gnu ( unit_aux, trim(nome_caso)//'.massa_especifica.grafico.gnu' )
       call PLOTA_executa_Wgnuplot ( unit_aux, trim(nome_caso)//'.massa_especifica.grafico.gnu' )
    end if

    ! gráfico do empuxo dinâmico

    if ( g_Fd == 1 ) then
       call ARQUIVO_grava_campo_1D ( unit_aux,             & ! unidade de arquivo para escrever
                             trim(nome_caso)//'.empuxo.dat', & ! nome do arquivo
                             w_Fd,                          & ! freqüência de escrita
                             1,                            & ! número do ponto inicial
                             n,                            & ! número de dados a escrever
                             xp,                           & ! dados da coluna 1
                             Fd                             ) ! dados da coluna 2
    end if

    if ( g_Fd == 2 ) then
       call ARQUIVO_grava_campo_e_tubeira ( unit_aux,      & ! unidade de arquivo para escrever
                             trim(nome_caso)//'.empuxo.dat', & ! nome do arquivo a gravar
                             w_Fd,                         & ! freqüência de escrita
                             1,                            & ! número do ponto inicial do campo
                             n,                            & ! número do ponto final do campo
                             xp,                           & ! dados da coluna 1
                             Fd,                           & ! dados da coluna 2
                             xe,                           & ! coordenada espacial da face da tubeira
                             re                            ) ! raio da face da tubeira
    end if

    if ( g_Fd == 1 .or. g_Fd == 2 ) then
       call PLOTA_gera_nomes ( unit_aux, '.empuxo.dat' )
       call PLOTA_le_dados_gnu (  unit_aux, 'mach1d.empuxo.grafico.ent' )
       call PLOTA_gera_gnu ( unit_aux, trim(nome_caso)//'.empuxo.grafico.gnu' )
       call PLOTA_executa_Wgnuplot ( unit_aux, trim(nome_caso)//'.empuxo.grafico.gnu' )
    end if

  end subroutine MACH1D_GER_graficos

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

  subroutine MACH1D_GER_le_dados ( unit, nome )

    integer,      intent(in) :: unit ! unidade do arquivo
    character*(*),intent(in) :: nome ! nome do arquivo

    open ( unit, file = trim(nome) )

    read ( unit, * ) titulo
    read ( unit, * ) nome_tubeira
    read ( unit, * ) modelo
    read ( unit, * ) w_lista
    read ( unit, * ) lista_caso

    read ( unit, * ) w_M
    read ( unit, * ) w_p
    read ( unit, * ) w_T
    read ( unit, * ) w_u
    read ( unit, * ) w_ro
    read ( unit, * ) w_Fd
    read ( unit, * ) w_p_tot
    read ( unit, * ) w_T_tot

    read ( unit, * ) w_grafico
    read ( unit, * ) g_M
    read ( unit, * ) g_p
    read ( unit, * ) g_T
    read ( unit, * ) g_u
    read ( unit, * ) g_ro
    read ( unit, * ) g_Fd

    read ( unit, * ) lista_rex

    close ( unit )

  end subroutine MACH1D_GER_le_dados

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

  subroutine MACH1D_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 programa

    open ( unit, file = trim(nome) )

    read ( unit, * ) nome_mach1d_ger 
    read ( unit, * ) lista_mach1d_ger
    read ( unit, * ) le_mach1d_ger
    read ( unit, * ) copia_mach1d_ger

    read ( unit, * ) arquivo_nome_inicio_modulo  
    read ( unit, * ) exato_mach_nome_inicio_modulo 
    read ( unit, * ) plota_nome_inicio_modulo
    read ( unit, * ) num_ger_nome_inicio_modulo
    read ( unit, * ) num_cte_nome_inicio_modulo
    read ( unit, * ) num_var_nome_inicio_modulo
    read ( unit, * ) num_cong_nome_inicio_modulo
    read ( unit, * ) num_eq_nome_inicio_modulo
    read ( unit, * ) num_tf_nome_inicio_modulo

    close ( unit )

  end subroutine MACH1D_GER_le_inicio

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

  subroutine MACH1D_GER_le_tubeira

    open ( unit_aux, file = trim(nome_tubeira), form = 'unformatted' )

    read ( unit_aux ) n, ng, xg, sg, rc

    ! *** ALOCAÇÃO DE MEMÓRIA ***
    allocate ( xp(n),   rp(n),   sp(n),  sn(n) )
    allocate ( xe(n-1), re(n-1), se(n-1) )

    read ( unit_aux ) xe, re, se, xp, rp, sp, sn

    close ( unit_aux )

  end subroutine MACH1D_GER_le_tubeira

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

  subroutine MACH1D_GER_propulsao ( fm, F_ex, g, F_g, c_star, Cf, Isp )

    real*8,intent(in)  :: fm     ! fluxo de massa (kg/s)
    real*8,intent(in)  :: F_ex   ! empuxo na saída da tubeira (N)
    real*8,intent(in)  :: g      ! aceleração gravitacional (m/s2)

    real*8,intent(in)  :: F_g    ! empuxo padrão (N)   

    real*8,intent(out) :: c_star ! velocidade característica (m/s)
    real*8,intent(out) :: Cf     ! coeficiente de empuxo (adimensional)
    real*8,intent(out) :: Isp    ! impulso específico (s)

    c_star = F_g / fm

    Cf = F_ex / F_g

    Isp = F_ex / ( fm * g )

  end subroutine MACH1D_GER_propulsao

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

  subroutine MACH1D_GER_saida_rex ( unit, Cd, F_star, r_qwh )

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

    real*8,intent(in)  :: Cd     ! coeficiente de descarga (adimensional)
    real*8,intent(in)  :: F_star ! empuxo dinâmico (adimensional)
    real*8,intent(in)  :: r_qwh  ! razão q_wall / q_sai (adimensional)

    real*8 :: dx ! tamanho médio dos volumes de controle (m)
   
!    call ARQUIVO_cria_arquivo ( unit, trim(nome_caso)//'.num' )
    open ( unit, file = trim(nome_caso)//'.mach1d.num' )

    dx = ( xe(n-1) - xe(1) ) / ( n - 2 )

    ! número total de variáveis = 3
    write(unit,1) dx, 3
    1 format(1pd25.15,' = dx',//, &
                   i5,' = número total de variáveis',/)

    ! parâmetro 1 = coeficiente de descarga
    write(unit,11) Cd
    11 format(3x,"'Cd'",/, &
               1pd25.15,' = solução numérica',/)

    ! parâmetro 2 = empuxo dinâmico (adimensional)
    write(unit,12) F_star
    12 format(3x,"'F*'",/, &
               1pd25.15,' = solução numérica',/)

    ! parâmetro 3 = razão q_wall / q_sai (adimensional)
    write(unit,13) r_qwh
    13 format(3x,"'qwh/qsai'",/, &
               1pd25.15,' = solução numérica',/)

    close(unit)

  end subroutine MACH1D_GER_saida_rex

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

end module MACH1D_GERAL
