module variaveis

! Objetivo: definir as variáveis globais do programa

use portlib
use data_hora

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

implicit none

real*8,parameter :: great  = 1.0d+11
real*8,parameter :: limite = 1.0d+10

! *** Variáveis principais ***

integer :: variavel ! número da variável de interesse nos arquivos de dados

integer :: nm  ! número de malhas

integer :: i   ! índice das malhas
               ! i = 1  ---> malha mais grossa
               ! i = nm ---> malha mais fina

integer :: m   ! número de extrapolações
               ! m = 1    ---> uma extrapolação
               ! m = nm-1 ---> número máximo de extrapolações

real*8  :: r21 ! razão de h entre as malhas grossa(2) e fina(1)
real*8  :: r32 ! razão de h entre as malhas supergrossa(3) e grossa(2)

integer :: pL  ! ordem assintótica do erro verdadeiro
integer :: dpL ! variação entre as ordens verdadeiras do erro verdadeiro

integer :: tipo_refino           ! tipo de refino de malha (r): 1=constante; 2=variável

integer :: com_solucao_analitica ! 1 = sim;   0 = não

! dados necessários apenas para tipo_refino = 2 (r variável)
! para obter a ordem aparente (pU) através do método da bisseção
integer :: numero_iteracoes ! número máximo de iterações
real*8  :: tol              ! tolerância
real*8  :: pU_min           ! limite inferior de pU
real*8  :: pU_max           ! limite superior de pU

real*8  :: T_exato ! solução analítica exata

real*8  :: Fs      ! fator de segurança do estimador GCI

! *** Variáveis de campo (vetores) com dimensão (1:nm) ***

character*50,dimension(:),allocatable :: arq_numerico ! nomes dos arquivos das soluções numéricas

real*8,dimension(:),allocatable :: h       ! comprimento de cada elemento da malha

real*8,dimension(:),allocatable :: Th      ! solução numérica em cada malha

integer,dimension(:),allocatable     :: pV  ! ordens verdadeiras do erro verdadeiro
character*2,dimension(:),allocatable :: pVt ! pV em formato texto

real*8,dimension(:),allocatable :: Ti_12   ! Th extrapolado com as malhas 1 e 2 e pL
real*8,dimension(:),allocatable :: Ti_13   ! Th extrapolado com as malhas 1 e 3 e pL
real*8,dimension(:),allocatable :: Ti_23   ! Th extrapolado com as malhas 2 e 3 e pL
real*8,dimension(:),allocatable :: Ti_pU   ! Th extrapolado com as malhas 1 a 3 e pU_h
real*8,dimension(:),allocatable :: Ti_bi   ! Th extrapolado com as malhas 1 a 3 e 2 coeficientes
real*8,dimension(:),allocatable :: Ti_tri  ! Th extrapolado com as malhas 1 a 4 e 3 coeficientes
real*8,dimension(:),allocatable :: Tc_12   ! Média de Ti_12 com Ti_pU
real*8,dimension(:),allocatable :: Tc_13   ! Média de Ti_13 com Ti_pU
real*8,dimension(:),allocatable :: Tbi_pU  ! Th biextrapolado com malhas 1 a 5 e pU_i

real*8,dimension(:),allocatable :: Eh      ! erro verdadeiro de Th

real*8,dimension(:),allocatable :: Ei_12   ! erro verdadeiro de Ti_12
real*8,dimension(:),allocatable :: Ei_13   ! erro verdadeiro de Ti_13
real*8,dimension(:),allocatable :: Ei_23   ! erro verdadeiro de Ti_23
real*8,dimension(:),allocatable :: Ei_pU   ! erro verdadeiro de Ti_pU
real*8,dimension(:),allocatable :: Ei_bi   ! erro verdadeiro de Ti_bi
real*8,dimension(:),allocatable :: Ei_tri  ! erro verdadeiro de Ti_tri
real*8,dimension(:),allocatable :: Ec_12   ! erro verdadeiro de Tc_12
real*8,dimension(:),allocatable :: Ec_13   ! erro verdadeiro de Tc_13
real*8,dimension(:),allocatable :: Ebi_pU  ! erro verdadeiro de Tbi_pU

real*8,dimension(:),allocatable :: pE_h    ! ordem efetiva do erro verdadeiro de Th
real*8,dimension(:),allocatable :: pE_i    ! ordem efetiva do erro verdadeiro de Ti_pU
real*8,dimension(:),allocatable :: pE_c12  ! ordem efetiva do erro verdadeiro de Tc_12
real*8,dimension(:),allocatable :: pE_c13  ! ordem efetiva do erro verdadeiro de Tc_13
real*8,dimension(:),allocatable :: pE_bi   ! ordem efetiva do erro verdadeiro de Tbi_pU

! Estimador delta (Ud)
real*8,dimension(:),allocatable :: Ud      ! erro estimado de Th

! Estimador de Richardson (Uri)
real*8,dimension(:),allocatable :: Uri_12  ! erro estimado de Th com as malhas 1 e 2 e pL
real*8,dimension(:),allocatable :: Uri_13  ! erro estimado de Th com as malhas 1 e 3 e pL
real*8,dimension(:),allocatable :: Uri_23  ! erro estimado de Th com as malhas 2 e 3 e pL
real*8,dimension(:),allocatable :: Uri_pU  ! erro estimado de Th com as malhas 1 a 3 e pU_h
real*8,dimension(:),allocatable :: Uri_p   ! erro estimado de Th com as malhas 1 a 3, pU_h e pL
real*8,dimension(:),allocatable :: Uri_bi  ! erro estimado de Th extrapolado com as malhas 1 a 3 e 2 coeficientes
real*8,dimension(:),allocatable :: Uri_tri ! erro estimado de Th extrapolado com as malhas 1 a 4 e 3 coeficientes

! Estimador GCI de Roache (GCI)
real*8,dimension(:),allocatable :: GCI_pL  ! erro estimado de Th com as malhas 1 e 2 e pL
real*8,dimension(:),allocatable :: GCI_p   ! erro estimado de Th com as malhas 1 a 3, pU_h e pL

! Estimador Convergente (Uc)
real*8,dimension(:),allocatable :: Uc_12   ! erro estimado de Tc_12
real*8,dimension(:),allocatable :: Uc_13   ! erro estimado de Tc_13

real*8,dimension(:),allocatable :: pU_h    ! ordem aparente do erro estimado de Th
real*8,dimension(:),allocatable :: pU_i    ! ordem aparente do erro estimado de Ti_pU
real*8,dimension(:),allocatable :: pU_c12  ! ordem aparente do erro estimado de Tc_12
real*8,dimension(:),allocatable :: pU_c13  ! ordem aparente do erro estimado de Tc_13
real*8,dimension(:),allocatable :: pU_bi   ! ordem aparente do erro estimado de Tbi_pU

integer,dimension(:),allocatable:: it_pU_h   ! número de iterações para obter pU_h
integer,dimension(:),allocatable:: it_pU_i   ! número de iterações para obter pU_i
integer,dimension(:),allocatable:: it_pU_c12 ! número de iterações para obter pU_c12
integer,dimension(:),allocatable:: it_pU_c13 ! número de iterações para obter pU_c13
integer,dimension(:),allocatable:: it_pU_bi  ! número de iterações para obter pU_bi

! *** Variáveis de campo (matrizes) com dimensão (1:nm,1:nm-1) ***

real*8,dimension(:,:),allocatable :: Um_12 ! erro estimado de Tm_12 com as malhas 1 e 2 e pV
real*8,dimension(:,:),allocatable :: Tm_12 ! Th multiextrapolado com as malhas 1 e 2 e pV

! *** váriaveis auxiliares ***

integer, parameter :: in   =  7 ! número do arquivo de entrada (dados)
integer, parameter :: out  = 10 ! número do arquivo de saída principal
integer, parameter :: out2 = 11 ! número do arquivo de saída secundário

character*50  :: caso           ! nome do arquivo de saída
character*90  :: title          ! título do gráfico
character*102 :: head           ! título do gráfico + dia
character*12  :: dia            ! data da simulação
character*8   :: hora           ! horário da simulação
character*90  :: note_caso      ! notepad + caso

character*50 :: arq_exato ! nome do arquivo da solução exata
character*50 :: arq_dados ! nome do arquivo de dados principal

integer :: dos                  ! acessa prompt dos

integer :: j, k ! auxiliares

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

end module variaveis