module dados

! Objetivos: definir as variáveis globais do código, 
!            ler e escrever os dados principais do código,
!            alocar memória para as variáveis globais.

! Versão atual: 17 Out 06

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

USE DFLIB 
use msfwin
use portlib

implicit none

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

! *** variáveis da malha ***

integer :: nx     ! número total de volumes na direção X (com 2 fictícios)
integer :: ny     ! número total de volumes na direção Y (com 2 fictícios)
integer :: nxy    ! nx * ny: número total de volumes da malha

integer :: i      ! número do volume na direção X
integer :: j      ! número do volume na direção Y
integer :: np     ! número do volume nas direções X e Y combinados

real*8  :: geom   ! geometria adotada: 1=artigo de Back et al. (1965);
                  !                    2=cossenoidal - artigo de Marchi et al. (2004)
real*8  :: coord  ! sistema de coordenadas: 0=plano; 1=axissimétrico
integer :: ig     ! número do volume na direção X da garganta da tubeira
real*8  :: Sg     ! área da garganta da tubeira (m2)
real*8  :: rcag   ! raio de curvatura adimensional na garganta da tubeira
real*8  :: rc     ! raio de curvatura na garganta da tubeira
real*8  :: Sc     ! área em cada seção transversal à tubeira

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

! *** variáveis do processo iterativo ***

real*8  :: dt     ! incremento de tempo
integer :: itmax  ! número máximo de iterações externas
integer :: it     ! número da iteração externa
integer :: imax   ! número máximo de iterações no ciclo da massa
integer :: im     ! número da iteração no ciclo da massa
integer :: nitm_u ! número máximo de iterações internas no MSI para u,v,T
real*8  :: tolu   ! tolerância do MSI para u,v,T
integer :: nitm_p ! número máximo de iterações internas no MSI para pl
real*8  :: tolp   ! tolerância do MSI para pl
real*8  :: tole   ! tolerância sobre as iterações externas (norma L1)
real*8  :: norma  ! norma L1 de todos os sistemas lineares na iteração it
real*8  :: norma1 ! norma L1 de todos os sistemas lineares na iteração it=1
integer :: itimax ! número máximo de iterações para resolver e(j)
integer :: itemax ! número máximo de iterações para resolver n
real*8  :: tol_e  ! tolerância para resolver e(j)
real*8  :: tol_n  ! tolerância para resolver n
integer :: it_q   ! número da iteração global para iniciar os cálculos reativos 
integer :: w_q    ! freqüência de iterações globais para fazer cálculos reativos
real*8  :: dpY    ! variação da pressão para calcular gama


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

! *** dados físicos ***

real*8  :: p0       ! pressão de estagnação na entrada da tubeira (Pa)
real*8  :: T0       ! temperatura de estagnação na entrada da tubeira (K)
real*8  :: gama_cte ! razão entre os calores específicos na entrada da tubeira (adimensional)
real*8  :: Rg_cte   ! constante do gás perfeito (J/kg.K)
real*8  :: cp_cte   ! calor específico constante (J/kg.K)
real*8  :: mi_cte   ! viscosidade absoluta constante (Pa.s)
real*8  :: k_cte    ! condutividade térmica constante (W/m.K)
real*8  :: fr_cte   ! fator de recuperação constante (adimensional)
real*8  :: h_cte    ! coeficiente de transf. de calor constante (W/m2.K)
integer :: tipo_cp  ! tipo de calor específico: 1=constante; 2=variável (ar); 3=variável(H2O)
integer :: tipo_mi  ! tipo de viscosidade absoluta: 1=constante; 2=variável
integer :: tipo_k   ! tipo de condutividade térmica: 1=constante; 2=variável
integer :: tipo_fr  ! tipo de fator de recuperação: 1=constante; 2=variável
integer :: tipo_h   ! tipo de coeficiente de transf. de calor: 1=constante; 2=variável
integer :: modelo_f ! modelo físico adotado: 1=monogás, 2=congelado, 3=equilíbrio
integer :: modelo_q ! modelo químico adotado
real*8  :: OF       ! razão oxidante/combustível
integer :: calor    ! 0=sem troca de calor com a parede; 1=com troca de calor
integer :: modelo_q_f  ! modelo químico (auxiliar para taxa finita)

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

! *** resultados físicos ***

real*8  :: fm1D   ! fluxo de massa analítico 1D (kg/s)
real*8  :: fmi    ! fluxo de massa numérico na entrada (kg/s)
real*8  :: fme    ! fluxo de massa numérico na saída (kg/s)
real*8  :: Fd1D   ! empuxo dinâmico analítico 1D (N)
real*8  :: Fd     ! empuxo dinâmico numérico (N)
real*8  :: Fpv1D  ! empuxo de pressão no vácuo analítico 1D (N)
real*8  :: ds     ! variação da entropia entre a câmara e a entrada do domínio


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

! *** dado das funções de interpolação

real*8  :: beta   ! fator de mistura da correção adiada: 0=UDS; 1=CDS

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

! *** variáveis com dimensão = nx ***

real*8,dimension(:),allocatable :: u1D ! u analítico 1D (m/s)
real*8,dimension(:),allocatable :: p1D ! p analítico 1D (Pa)
real*8,dimension(:),allocatable :: T1D ! T analítico 1D (K)
real*8,dimension(:),allocatable :: M1D ! M analítico 1D (adimensional)

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

! *** variáveis com dimensão = ny ***

real*8,dimension(:),allocatable :: uin   ! u na entrada extrapolado
real*8,dimension(:),allocatable :: vin   ! v na entrada extrapolado
real*8,dimension(:),allocatable :: pin   ! p na entrada prescrita
real*8,dimension(:),allocatable :: Tin   ! T na entrada prescrita
real*8,dimension(:),allocatable :: Mw    ! M na entrada
real*8,dimension(:),allocatable :: plin  ! pl na entrada
real*8,dimension(:),allocatable :: pina  ! pin do instante anterior
real*8,dimension(:),allocatable :: entin ! ent na entrada extrapolado

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

! *** variáveis com dimensão = nxy ***

real*8,dimension(:),allocatable :: x    ! coordenada X da malha no canto ne
real*8,dimension(:),allocatable :: y    ! coordenada Y da malha no canto ne
real*8,dimension(:),allocatable :: raio ! raio da malha no canto ne

real*8,dimension(:),allocatable :: xp   ! coordenada X da malha no centro do volume
real*8,dimension(:),allocatable :: yp   ! coordenada Y da malha no centro do volume
real*8,dimension(:),allocatable :: rp   ! raio da malha no centro do volume
real*8,dimension(:),allocatable :: Jp   ! Jacobiano no centro do volume

real*8,dimension(:),allocatable :: re   ! raio da malha no centro da face leste
real*8,dimension(:),allocatable :: xe   ! métrica da malha no centro da face leste
real*8,dimension(:),allocatable :: ye   ! métrica da malha no centro da face leste

real*8,dimension(:),allocatable :: rn   ! raio da malha no centro da face norte
real*8,dimension(:),allocatable :: xk   ! métrica da malha no centro da face norte
real*8,dimension(:),allocatable :: yk   ! métrica da malha no centro da face norte

real*8,dimension(:),allocatable :: u    ! velocidade cartesiana na direção X no centro do volume
real*8,dimension(:),allocatable :: v    ! velocidade cartesiana na direção Y no centro do volume
real*8,dimension(:),allocatable :: p    ! pressão no centro do volume
real*8,dimension(:),allocatable :: T    ! temperatura no centro do volume
real*8,dimension(:),allocatable :: ro   ! massa específica no centro do volume

real*8,dimension(:),allocatable :: cp   ! calor específico à p constante no centro do volume
real*8,dimension(:),allocatable :: M    ! número de Mach
real*8,dimension(:),allocatable :: gama ! razão entre calores específicos, prop. variáveis (adimensional)
real*8,dimension(:),allocatable :: gamaf ! razão entre calores específicos, congelado (adimensional)
real*8,dimension(:),allocatable :: Rg   ! constante da mistura de gases (J/kg.K)
real*8,dimension(:),allocatable :: fr   ! fator de recuperação (adimensional)
real*8,dimension(:),allocatable :: ent  ! entropia (J/kg.K)

real*8,dimension(:),allocatable :: pl   ! variação da pressão no centro do volume
real*8,dimension(:),allocatable :: Uce  ! velocidade contravariante na direção ksi na face leste
real*8,dimension(:),allocatable :: Vcn  ! velocidade contravariante na direção eta na face norte
real*8,dimension(:),allocatable :: roe  ! massa específica no centro da face leste
real*8,dimension(:),allocatable :: ron  ! massa específica no centro da face norte
real*8,dimension(:),allocatable :: de   ! coeficiente do SIMPLEC na face leste
real*8,dimension(:),allocatable :: dn   ! coeficiente do SIMPLEC na face norte

real*8,dimension(:),allocatable :: ua   ! u do instante anterior
real*8,dimension(:),allocatable :: va   ! v do instante anterior
real*8,dimension(:),allocatable :: pa   ! p do instante anterior
real*8,dimension(:),allocatable :: Ta   ! T do instante anterior
real*8,dimension(:),allocatable :: roa  ! ro do instante anterior
real*8,dimension(:),allocatable :: ucea ! uce do instante anterior
real*8,dimension(:),allocatable :: vcna ! vcn do instante anterior

real*8,dimension(:),allocatable :: b    ! termo fonte de u,v,T,pl

real*8,dimension(:),allocatable :: cup  ! fator da correção adiada de u
real*8,dimension(:),allocatable :: cvp  ! fator da correção adiada de v
real*8,dimension(:),allocatable :: cYip ! fator de correção adiada de Yi

real*8,dimension(:),allocatable :: psi  ! função de corrente

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

! Dados químicos

integer :: ii ! índice relativo à espécie química
integer :: Ne ! número de espécies químicas
character*4,dimension(:),allocatable :: especie ! nome da espécie química
real*8,dimension(:,:),allocatable :: Yi  ! fração mássica (adim.)
real*8,dimension(:,:),allocatable :: Wi  ! geração de massa (kg/m3.s)
real*8,dimension(:,:),allocatable :: hi     ! entalpia
real*8,dimension(:,:),allocatable :: Yia ! Yi do tempo anteior
real*8,dimension(:,:),allocatable :: Yi_in ! fração mássica (adim.) na entrada da tubeira
real*8,dimension(:,:),allocatable :: Yi1  ! fração mássica (adim.)
real*8,dimension(:,:),allocatable :: hi1     ! entalpia
character*4,dimension(:),allocatable :: especie1 ! nome da espécie química


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

! *** variáveis com dimensão = nxy,5 ***

! primeiro índice = variável np
! segundo  índice = identificação do coeficiente: 1=S; 2=W; 3=P; 4=E; 5=N

real*8,dimension(:,:),allocatable :: a  ! coeficientes de u,v,T,pl

! a(np,1)*T(nps) + a(np,2)*T(npw) + a(np,3)*T(np) + 
! a(np,4)*T(npe) + a(np,5)*T(npn) = b(np)

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

! *** variáveis com dimensão = nxy,4 ***

real*8,dimension(:,:),allocatable :: dl ! coeficientes de a low no MSI

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

! *** variáveis com dimensão = nxy,3 ***

real*8,dimension(:,:),allocatable :: du ! coeficientes de a up no MSI

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

! *** variáveis auxiliares ***

integer      :: w_cam ! =1, escreve campos;   =0, não
integer      :: w_r   ! freqüência de escrita dos resíduos e globais
integer      :: w_g   ! freqüência de escrita nos gráficos
integer      :: sem_a ! 1=não abre arquivos; 0=abre
integer      :: sem_g ! 1=não abre gráficos; 0=abre
logical      :: dos   ! acessa prompt dos
character*50 :: caso  ! nome do experimento numérico
character*80 :: title ! título do gráfico
character*80 :: hard  ! hardware
character*92 :: head  ! título do gráfico + dia
integer(4)   :: fim   ! fecha framewindow
logical      :: name  ! nome da framewindow
character*12 :: dia   ! data da simulação
character*8  :: hora  ! horário da simulação
character*90 :: nome  ! auxiliar
real*8       :: tcpu  ! tempo de processamento
real*8       :: pi    ! constante matemática pi

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

contains

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

  subroutine le_dados

    ! lê a variável sem_a no arquivo inicial
    open(7,file='Mach2D_6p0.in')
    read(7,*) sem_a
    close(7)

    if ( sem_a == 0 ) dos = system('notepad Mach2D_6p0.ent') ! lista dados

    open(7,file='Mach2D_6p0.ent')

    read(7,*) caso
	read(7,*) modelo_f
    read(7,*) coord
	read(7,*) geom
    read(7,*) nx
    read(7,*) ny
    read(7,*) hard
    read(7,*) title

    close(7)

    ! cálculo de dados secundários

    pi  = dacos(-1.0d0)

    nx  = nx + 2

    ny  = ny + 2

    nxy = nx * ny

  end subroutine le_dados

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

  subroutine MONOGAS_le_dados
  
    if ( sem_a == 0 ) dos = system('notepad Mach2D_6p0_monogas.ent') ! lista dados
 
    open (7,file = 'Mach2D_6p0_monogas.ent')

    read(7,*) p0
    read(7,*) T0
	read(7,*) tipo_cp
    read(7,*) gama_cte
    read(7,*) Rg_cte
    read(7,*) dt
    read(7,*) tole
    read(7,*) itmax
    read(7,*) imax
    read(7,*) tolu
    read(7,*) tolp
    read(7,*) nitm_u
    read(7,*) nitm_p
    read(7,*) beta
    read(7,*) w_cam
    read(7,*) w_r
    read(7,*) w_g
    read(7,*) sem_a
    read(7,*) sem_g

    close (7)

  end subroutine MONOGAS_le_dados 

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

  subroutine NUM_CONG_le_dados
  
    if ( sem_a == 0 ) dos = system('notepad Mach2D_6p0_congelado.ent') ! lista dados
 
    open (8,file = 'Mach2D_6p0_congelado.ent')

    read (8,*) p0
    read (8,*) T0

    read (8,*) Rg_cte
    read (8,*) gama_cte

    read (8,*) tipo_cp

!    read (8,*) tipo_f
!    read (8,*) f_cte
!    read (8,*) rugoso

!    read (8,*) tipo_h
!    read (8,*) h_cte

!    read (8,*) tipo_mi
!    read (8,*) mi_cte

    read (8,*) tipo_k
    read (8,*) k_cte

!    read (8,*) tipo_T_wall
!    read (8,*) T_wall_cte
!    read (8,*) T_wall_nome

    read (8,*) tipo_fr
    read (8,*) fr_cte

!    read (8,*) epsilon_cte
!    read (8,*) sigma

    read (8,*) OF
    read (8,*) itimax
    read (8,*) tol_e
    read (8,*) itemax
    read (8,*) tol_n
    read (8,*) modelo_q
    read (8,*) it_q
    read (8,*) w_q

!    read (8,*) RHG
!    read (8,*) para_canal_nome

!    read (8,*) calor
    read (8,*) dt
    read (8,*) tole
    read (8,*) itmax
    read (8,*) imax
    read (8,*) tolu
    read (8,*) tolp
    read (8,*) nitm_u
    read (8,*) nitm_p
    read (8,*) beta
    read (8,*) w_cam
    read (8,*) w_r
    read (8,*) w_g
    read (8,*) sem_a
    read (8,*) sem_g

    close (8)

  end subroutine NUM_CONG_le_dados 

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

  subroutine NUM_EQ_le_dados
  
    if ( sem_a == 0 ) dos = system('notepad Mach2D_6p0_equilibrio.ent') ! lista dados
 
    open (8,file = 'Mach2D_6p0_equilibrio.ent')

    read (8,*) p0
    read (8,*) T0

    read (8,*) Rg_cte
    read (8,*) gama_cte

    read (8,*) tipo_cp

!    read (8,*) tipo_f
!    read (8,*) f_cte
!    read (8,*) rugoso

!    read (8,*) tipo_h
!    read (8,*) h_cte

!    read (8,*) tipo_mi
!    read (8,*) mi_cte

    read (8,*) tipo_k
    read (8,*) k_cte

!    read (8,*) tipo_T_wall
!    read (8,*) T_wall_cte
!    read (8,*) T_wall_nome

    read (8,*) tipo_fr
    read (8,*) fr_cte

!    read (8,*) epsilon_cte
!    read (8,*) sigma

    read (8,*) OF
    read (8,*) itimax
    read (8,*) tol_e
    read (8,*) itemax
    read (8,*) tol_n
    read (8,*) modelo_q
    read (8,*) it_q
    read (8,*) w_q

!    read (8,*) RHG
!    read (8,*) para_canal_nome

!    read (8,*) calor
    read (8,*) dt
    read (8,*) tole
    read (8,*) itmax
    read (8,*) imax
    read (8,*) tolu
    read (8,*) tolp
    read (8,*) nitm_u
    read (8,*) nitm_p
    read (8,*) beta
	read (8,*) dpY
    read (8,*) w_cam
    read (8,*) w_r
    read (8,*) w_g
    read (8,*) sem_a
    read (8,*) sem_g

    close (8)

  end subroutine NUM_EQ_le_dados 

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

  subroutine NUM_TF_le_dados 

    if ( sem_a == 0 ) dos = system('notepad Mach2D_6p0_taxa_finita.ent') ! lista dados

    open (8,file = 'Mach2D_6p0_taxa_finita.ent')

    read (8,*) p0
    read (8,*) T0

    read (8,*) Rg_cte
    read (8,*) gama_cte

    read (8,*) tipo_cp

!    read (8,*) tipo_f
!    read (8,*) f_cte
!    read (8,*) rugoso

!    read (8,*) tipo_h
!    read (8,*) h_cte

!    read (8,*) tipo_mi
!    read (8,*) mi_cte

    read (8,*) tipo_k
    read (8,*) k_cte

!    read (8,*) tipo_T_wall
!    read (8,*) T_wall_cte
!    read (8,*) T_wall_nome

    read (8,*) tipo_fr
    read (8,*) fr_cte

!    read (8,*) epsilon_cte
!    read (8,*) sigma

    read (8,*) OF
    read (8,*) itimax
    read (8,*) tol_e
    read (8,*) itemax
    read (8,*) tol_n
    read (8,*) modelo_q_f
    read (8,*) it_q
    read (8,*) w_q

!    read (8,*) RHG
!    read (8,*) para_canal_nome

!    read (8,*) calor
    read (8,*) dt
    read (8,*) tole
    read (8,*) itmax
    read (8,*) imax
    read (8,*) tolu
    read (8,*) tolp
    read (8,*) nitm_u
    read (8,*) nitm_p
    read (8,*) beta
	read (8,*) dpY
    read (8,*) w_cam
    read (8,*) w_r
    read (8,*) w_g
    read (8,*) sem_a
    read (8,*) sem_g

!    read ( unit, * ) RHG
!    read ( unit, * ) para_canal_nome

!    read ( unit, * ) calor

    close (8)

    cp_cte = gama_cte * Rg_cte / ( gama_cte - 1.0d0 )

    if ( modelo_q_f == 31 .or. modelo_q_f == 32 ) then
       modelo_q = 3
    else
       modelo_q = modelo_q_f
    end if

  end subroutine NUM_TF_le_dados 

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

  subroutine mostra_dados

    write(10,1) title, caso, modelo_f, coord,     geom,   nx-2,    ny-2,   (nx-2)*(ny-2)


    1 format(/,'título = ',a,//, &
                  5x,'DADOS',//,  &
               'caso: nome do experimento numérico = ', a, //, &
			  i8,12x,'   = modelo físico adotado:',/,t26,'1 = monogás',/,t26,'2 = esc. congelado',/,t26,'3 = esc. em equilíbrio',/,t26,'4 = esc. em taxa finita',//, &
             1pe22.9,' = coord: sistema de coordenadas: 0=plano; 1=axissimetrico',//, &
			 1pe22.9,' = geometria utilizada: 1 = artigo de Back et al. (1965); 2 = cossenoidal - artigo de Marchi et al. (2004)',//, &
              i8,12x,'   = nx:  número de volumes reais na direção X',/, &
              i8,12x,'   = ny:  número de volumes reais na direção Y',/, &
              i8,12x,'   = nxy: número total de volumes reais',/)

	
	if (modelo_f == 1) write (10,2) p0,    T0,   gama_cte, Rg_cte,    dt,     tipo_cp, tole,  &
                                    itmax, imax, tolu,     tolp,      nitm_u, nitm_p,  beta,  &
                                    w_cam, w_r,  w_g,      sem_a,     sem_g

	2 format(/, &
	         1pe22.9,' = po: pressão de estagnação na entrada da tubeira (Pa)',/, &
             1pe22.9,' = T0: temperatura de estagnação na entrada da tubeira (K)',//, &
			 1pe22.9,' = gama: razão entre os calores específicos na entrada da tubeira (adimensional)',/, &
             1pe22.9,' = Rg: constante do gás perfeito (J/kg.K)',//, &
             1pe22.9,' = dt: incremento de tempo (s)',//, &
			  i8,12x,'   = tipo de calor específico: 1=constante, 2=variável(ar), 3=variável(H2O)',//,&
             1pe22.9,' = tole: tolerância sobre as iterações externas (norma L1 adim.)',/, &
              i8,12x,'   = itmax: número máximo de iterações externas',/, &
              i8,12x,'   = imax:  número máximo de iterações no ciclo da massa',/, &
             1pe22.9,' = tolu: tolerância no MSI para u,v',/, &
             1pe22.9,' = tolp: tolerância no MSI para plinha',/, &
              i8,12x,'   = nitm_u: número máximo de iterações internas no MSI para u,v,T',/, &
              i8,12x,"   = nitm_p: número máximo de iterações internas no MSI para p'",/, &
             1pe22.9,' = beta: fator de mistura da correção adiada: 0=UDS; 1=CDS',//, &
              i8,12x,'   = w_cam: =1, escreve campos;   =0, não',/, &
              i8,12x,'   = w_r:   freqüência de escrita dos resíduos e globais',/, &
              i8,12x,'   = w_g:   freqüência de escrita nos gráficos',/, &
              i8,12x,'   = sem_a: 1=não abre arquivos; 0=abre',/, &
              i8,12x,'   = sem_g: 1=não abre gráficos; 0=abre',/)

	if (modelo_f == 2) write (10,3) modelo_q, p0,    T0,   OF,     dt,     gama_cte, Rg_cte,  tipo_cp, &
                                    tole,     itmax, imax, tolu,   tolp,   nitm_u,   nitm_p,  beta, &
                                    w_cam,    w_r,   w_g,  sem_a,  sem_g
	if (modelo_f == 3) write (10,3) modelo_q, p0,    T0,   OF,     dt,     gama_cte, Rg_cte,  tipo_cp, &
                                    tole,     itmax, imax, tolu,   tolp,   nitm_u,   nitm_p,  beta, &
                                    w_cam,    w_r,   w_g,  sem_a,  sem_g

	if (modelo_f == 4) write (10,3) modelo_q_f, p0,    T0,   OF,     dt,     gama_cte, Rg_cte,  tipo_cp, &
                                    tole,     itmax, imax, tolu,   tolp,   nitm_u,   nitm_p,  beta, &
                                    w_cam,    w_r,   w_g,  sem_a,  sem_g


	3 format(/, &
	          i8,12x,'   = modelo químico adotado',2/,&
	         1pe22.9,' = po: pressão de estagnação na entrada da tubeira (Pa)',/, &
             1pe22.9,' = T0: temperatura de estagnação na entrada da tubeira (K)',//, &
             1pe22.9,' = OF: razão oxidante/combustível (adimensional)',//, &
             1pe22.9,' = dt: incremento de tempo (s)',/, &
			 1pe22.9,' = gama: razão entre os calores específicos, informado (adimensional)',/, &
             1pe22.9,' = Rg: constante do gás perfeito, informado (J/kg.K)',//, &
			  i8,12x,'   = tipo de calor específico:1=constante; 2=variável',//,&
             1pe22.9,' = tole: tolerância sobre as iterações externas (norma L1 adim.)',/, &
              i8,12x,'   = itmax: número máximo de iterações externas',/, &
              i8,12x,'   = imax:  número máximo de iterações no ciclo da massa',/, &
             1pe22.9,' = tolu: tolerância no MSI para u,v',/, &
             1pe22.9,' = tolp: tolerância no MSI para plinha',/, &
              i8,12x,'   = nitm_u: número máximo de iterações internas no MSI para u,v,T',/, &
              i8,12x,"   = nitm_p: número máximo de iterações internas no MSI para p'",/, &
             1pe22.9,' = beta: fator de mistura da correção adiada: 0=UDS; 1=CDS',//, &
              i8,12x,'   = w_cam: =1, escreve campos;   =0, não',/, &
              i8,12x,'   = w_r:   freqüência de escrita dos resíduos e globais',/, &
              i8,12x,'   = w_g:   freqüência de escrita nos gráficos',/, &
              i8,12x,'   = sem_a: 1=não abre arquivos; 0=abre',/, &
              i8,12x,'   = sem_g: 1=não abre gráficos; 0=abre',/)

    write(10,11) hard

	11 format(/, 'hard: hardware = ', a )

  end subroutine mostra_dados

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

  subroutine aloca_memoria

    allocate ( x(nxy),   xp(nxy),   y(nxy),     yp(nxy)    )

    allocate ( rp(nxy),  re(nxy),   rn(nxy),    raio(nxy)  )

    allocate ( xe(nxy),  ye(nxy),   xk(nxy),    yk(nxy),   Jp(nxy) )

    allocate ( u(nxy),   v(nxy),    p(nxy),     T(nxy),    ro(nxy) )

    allocate ( pl(nxy),  Uce(nxy),  Vcn(nxy),   roe(nxy),  ron(nxy) )

    allocate ( ua(nxy),  va(nxy),   pa(nxy),    Ta(nxy),   roa(nxy) )

    allocate ( de(nxy),  dn(nxy),   psi(nxy),   M(nxy)     )

    allocate ( cp(nxy),  gama(nxy), gamaf(nxy), Rg(nxy),   fr(nxy),   ent(nxy) )
	
	allocate ( cup(nxy), cvp(nxy),  ucea(nxy),  vcna(nxy)  )

    allocate ( a(nxy,5), dl(nxy,4), du(nxy,3),  b(nxy)     )

    allocate ( uin(ny),  vin(ny),   Tin(ny),    pin(ny),   entin(ny) )

    allocate ( Mw(ny),   plin(ny),  pina(ny)    )

    allocate ( u1D(nx),  p1D(nx),   T1D(nx),   M1D(nx)    )

  end subroutine aloca_memoria

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

  subroutine data_hora

    integer*4    :: var(8) ! data e hora
    character*20 :: vardate,vartime,varzone ! data e hora
    character*2  :: aux1,aux2
    character*4  :: aux3
    character*50 :: aux

    call date_and_time(vardate,vartime,varzone,var)

    write(aux,*) var(3)
    aux1 = trim(adjustl(aux))
    write(aux,*) var(2)
    aux2 = trim(adjustl(aux))
    write(aux,*) var(1)
    aux3 = trim(adjustl(aux))
    dia = '('//trim(aux1)//'/'//trim(aux2)//'/'//aux3//')'

    write(aux,*) var(5)
    aux1 = trim(adjustl(aux))
    write(aux,*) var(6)
    aux2 = trim(adjustl(aux))
    write(aux,*) var(7)
    aux3 = trim(adjustl(aux))
    hora = trim(aux1)//':'//trim(aux2)//':'//aux3

    write(10,18) dia, hora
    18 format(/,5x,'Dia = ',a12,5x,'Hora = ',a8)

    head = trim(title)//" "//trim(dia)//"'"

  end subroutine data_hora

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

end module dados
