!Universidade Federal do Paraná (2006)
!Programa de Pós-Graduação em Métodos Numércios em Engenharia
!Grupo de Dinâmica dos Fluidos Computacional (CFD)
!Doutorandos: Marcio Villela e Roberta Suero

!MULTIGRID
	! Programa Laplace2D_FAS versão 1 
	! Obs.: Esta versão admite ir até o erro de máquina, ou seja, 
	! admite epsilon negativo
	! Equação de Advecção - Difusão 2D Linear
	! Condição de Fronteira de Dirichlet (nula com senóide ao norte)  
	! Método das Diferenças Finitas
	! Malha Uniforme e Estruturada
	! Problemas Isotrópicos e Anisotrópicos
	! Multigrid Geométrico (op 1) ou Singlegrid (op 2)
	! Algoritmo: Esquema de Aproximação Completa (FAS) - Algoritmo Não-linear
	! Restrição: Injecao
	! Prolongação: Interpolação Bilinear
	! Ciclo V (sem FMG)
	! Engrossamento: padrão e pura (q = 1 ==> r = p) r = 2  
	! Solver: Gauss Seidel (solver 1), MSI (solver 2) ou ADI (solver 3) 
	!         para Singlegrid e Multigrid

	!IMPORTANTE1: Não há semi-engrossamento padrão SE (engrossamento em apenas uma das direções)
	!IMPORTANTE2: Não há semi-engrossamento parcial (engrossamento padrão seguido de 
	!             semi-engrossamento padrão EP-SE ou o inverso SE-EP)
	!IMPORTANTE3: 1 e 2 implicam que em problemas isotrópicos há engrossamento padrão até a malha 
	!             mais grossa em ambas as direções e em problemas anisotrópicos, o engrossamento padrão 
	!             termina no máximo de alguma das direções, não se preocupando em um possível 
	!             semi-engrossamento em uma outra direção que seria possível semi-engrossar, ou seja, 
	!             EP é feito a todo momento
	
	!IMPORTANTE4: Este programa eh utilizado para se fazer o teste de coerência e para se gerar as 
	!soluções exatas (Solução numérica levada até que se atinja o erro de máquina)
	
	
program MGLinear_L2D
!programa MGLinear_L2D_FAS

use msflib
use msfwin

use Processamento
use Coef

!Leitura dos dados de entrada *******

call Dados

 select case (op) 

        case (1)   !Resolve multigrid

           	repete=0
			
			tcpu = timef()

			do while (tcpu<10)

		    			
				call Malhas
				call sol_exata

			
				call SolMultigrid
				
				tcpu = timef()

				if (tcpu<10) then

					deallocate(Nxm,Nym,Nxmm,Nymm)
					deallocate(npm,npmm)
					deallocate(A,dl,du)
					deallocate(AS,AW,AP,AE,AN,BP,TNum)
					deallocate(TA,T,R,dT,fonte,T_inf)

									
				end if
			  			
				repete=repete+1

				tempo = tcpu/repete	  
			  
			  end do

		
       case (2)
	    
		 
		 repete=0

		 tcpu = timef()

	

		 Nxy = Nx*Ny
		 		 
		 !Nx é o número de pontos (nos) na direção x
		 !Ny é o número de pontos (nos) na direção y
		 !Nxy=Nx*Ny é o numero de pontos (nos) na malha (domínio plano)
		 
		 do while (tcpu<10)

			 !alocação de memória

   			 
			 call sol_exata
  			 call SolSinglegrid
			 
			tcpu = timef()

			if (tcpu<10) then
			
			
				deallocate(AS,AW,AP,AE,AN,BP,TNum,TA,T_inf)
				deallocate(A,dl,du,npm)
					
				if (solver == 4) deallocate(MA) 

			end if

			repete=repete+1

			tempo = tcpu/repete	  
		
		end do

		 
              
 end select

!*************************************************************

call Pos_processamento

end program MGLinear_L2D