program STOKES_1p5

!     Escoamento Bidimensional Isotérmico e
!     Permanente de Fluido Incompressível

!     Versão atual    1.5 (21 Out 07)

!     Versão          1.3 ( 6 Out 05)
!     Versão          1.2 (29 Jul 05)
!     Versão          1.1 (30 Abr 99)
!     Versão original 1.0 (25 Mar 99)

!     última alteração =    5 Nov 07

!     Autor: Carlos Henrique Marchi
!            DEMEC/UFPR, Curitiba, PR


! MODELO MATEMÁTICO (equações diferenciais):
! -----------------------------------------

!   massa: du/dx + dv/dy = 0

!   QMLx:  d(u2)/dx + d(uv)/dy = -dp/dx + mi*laplaciano(u)

!   QMLy:  d(uv)/dx + d(v2)/dy = -dp/dy + mi*laplaciano(v) - S

!   x, y = coordenadas espaciais (m)
!   u, v = velocidades nas direções x e y (m/s)
!   p    = pressão estática (Pa)
!   mi   = viscosidade absoluta (Pa.s)
!   S    = termo fonte; nulo no problema de Ghia
!   Re   = Ut * L / mi (número de Reynolds)
!   Ut   = velocidade máxima da tampa da cavidade (1 m/s)
!   Cavidade quadrada (L=1 por H=1 m)
!   ro   = massa específica (1 kg/m3)
!   Condição de contorno de Dirichlet para u e v
!   Tipos de problemas pré-definidos: 
!     1 = Shih: u na tampa é uma função de x; u e v nulos nas outras paredes
!     2 = Ghia: u na tampa é constante = 1; u e v nulos nas outras paredes


! MODELO NUMÉRICO (resumo):
! ------------------------

!   Incógnitas: u, v, p
!   Condições de contorno de Dirichlet para u e v aplicadas com volumes fictícios
!   A p é extrapolado linearmente dos nós internos para os contornos
!   Método numérico: volumes finitos
!   Funções de interpolação para u e v: 
!     CDS para os termos difusivos e de pressão
!     UDS ou CDS (com correção adiada) para os termos advectivos
!   Malha uniforme em cada direção
!   Método de acoplamento pressão-velocidade: SIMPLEC
!   Solução segregada (seqüencial) das equações diferenciais
!   Solvers: Jacobi, Gauss-Seidel, SOR, ADI e MSI-5
!   Precisão: dupla
!   Tempo é usado para avanço do processo iterativo
!   Arranjo co-localizado de variáveis (média NHT/1994)
!   Linguagem FORTRAN 95
!   Aplicativo usado: Fortran Intel 9.1
!   Tipo de projeto: Console; versão Release
!   Variáveis de interesse:
!     Valor mínimo da função de corrente, e seu X e Y, baseado na velocidade média
!        u na face leste de cada volume e com integral retângulo
!     Valor mínimo da função de corrente, e seu X e Y, baseado na velocidade média
!        u na face leste de cada volume e com integral trapézio
!     Fluxo de massa que escoa em y=0.5 e x[0;0.5]: obtido com a integração 
!        pela regra do retângulo da velocidade média v na face norte de cada volume
!     Idem com a regra do trapézio
!     Força viscosa da placa sobre o fluido: obtida com integração retângulo 
!        da derivada du/dy em y=1 obtida com velocidade nodal u e com UDS
!     Força viscosa da placa sobre o fluido: obtida com integração retângulo 
!        da derivada du/dy em y=1 obtida com velocidade nodal u e com UDS-2
!     Força viscosa da placa sobre o fluido: obtida com integração trapézio
!        da derivada du/dy em y=1 obtida com velocidade na face ue e com UDS
!     Força viscosa da placa sobre o fluido: obtida com integração retângulo 
!        da derivada du/dy em y=0 obtida com velocidade nodal u e com DDS
!     Derivada du/dy em x=0.5 e y=1: obtida com velocidade média u 
!        e com UDS; válido só para número de volumes pares em x;
!     Pressão no centro do domínio: obtido por média aritmética de p nos
!        quatro nós vizinhos
!     Perfil da velocidade u em x = 0.5: obtido por média aritmética das
!        velocidades na face leste nos dois volumes vizinhos
!     Perfil da velocidade v em y = 0.5: obtido por média aritmética das
!        velocidades na face norte nos dois volumes vizinhos
!     Valor mínimo de u, e seu Y, do perfil da velocidade u em x = 0.5 obtido por
!        média aritmética das velocidades na face leste nos dois volumes vizinhos
!     Valor mínimo de v, e seu X, do perfil da velocidade v em y = 0.5 obtido por
!        média aritmética das velocidades na face norte nos dois volumes vizinhos
!     Valor máximo de v, e seu X, do perfil da velocidade v em y = 0.5 obtido por
!        média aritmética das velocidades na face norte nos dois volumes vizinhos
!     Pressão no centro do domínio obtido por média aritmética de 4 p nodais
!   Estimativa inicial da solução numérica é igual a:
!     Solução analítica do problema de Shih ou Zero
!   Expressão genérica dos sistemas de equações discretizados:
!     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)
!     onde T representa u, v ou plinha


! ARQUIVOS envolvidos no programa:
! -------------------------------

!   Executável:
!     Stokes_1p5.exe

!   Dados:
!     Stokes_1p5.ent = arquivo principal de dados (do usuário) do programa 
!     Stokes_1p5_u_Shih.gnu = dados para gerar gráfico dos perfis de u no problema de Shih
!     Stokes_1p5_v_Shih.gnu = dados para gerar gráfico dos perfis de v no problema de Shih
!     Stokes_1p5_u_Ghia.gnu = dados para gerar gráfico dos perfis de u no problema de Ghia
!     Stokes_1p5_v_Ghia.gnu = dados para gerar gráfico dos perfis de v no problema de Ghia
!     Stokes_1p5_R.gnu      = dados para gerar gráfico dos resíduo das equações ao longo das iterações
!     Ghia_Re_100_U.dat   = perfil de u no problema de Ghia para Re = 100
!     Ghia_Re_1000_U.dat  = perfil de u no problema de Ghia para Re = 1000
!     Ghia_Re_10000_U.dat = perfil de u no problema de Ghia para Re = 10000
!     Ghia_Re_100_V.dat   = perfil de v no problema de Ghia para Re = 100
!     Ghia_Re_1000_V.dat  = perfil de v no problema de Ghia para Re = 1000
!     Ghia_Re_10000_V.dat = perfil de v no problema de Ghia para Re = 10000

!   Saídas:
!     "caso".txt = saída principal do programa
!     "caso".itn = algumas variáveis de interesse ao longo das iterações
!     "caso".Richrdson_3p0 = variáveis de interesse para o programa Richardson 3.0
!     r.dat      = resíduo das equações ao longo das iterações
!     ucex.dat   = perfil de u em x=1/2 (exato)
!     vcex.dat   = perfil de v em y=1/2 (exato).
!     u.dat      = perfil de u em x=1/2 (numérico)
!     v.dat      = perfil de v em y=1/2 (numérico)

!   Fontes:
!     Stokes_1p5_main.f90         = programa principal
!     Stokes_1p5_coeficientes.f90 = calcula coeficientes dos sistemas de equações
!     Stokes_1p5_dados.f90        = lê e lista os dados do programa
!     Stokes_1p5_resultados.f90   = resolve equações e gera listagem dos resultados
!     Stokes_1p5_solvers.f90      = solvers disponíveis
!     Stokes_1p5_variaveis.f90    = define todas as variáveis globais do programa
!
!   Outros arquivos:
!     Notepad.exe    = editor de arquivos
!     Wgnuplot.exe   = programa gerador de gráfico (versão 3.5)

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

use resultados

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

implicit none

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

  call le_dados

  open(10,file=trim(adjustl(caso))//'.txt')

  call data_hora

  call mostra_dados

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

  call solucao_numerica

  close (10)

  note_caso = 'notepad '//caso
  dos = system(note_caso) ! lista arquivo de resultados

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

end
