program malha_quadrangular_1p0

	use variaveis
	use dados
	use malhas_segmentos
	use solvers
	use coeficientes_e_fontes
	use metricas

	implicit none

	call entradas

	! Número de volumes em cada direção com fictícios
	Nf1 = N1 + 2
	Nf2 = N2 + 2
		
	! Número total de volumes
	Nt  = N1*N2
	Ntf	= Nf1*Nf2

	! Número total de vértices, por direção
	Nv1 = N1+1
	Nv2 = N2+1

	! Número total de vértices
	Nvt = Nv1*Nv2

	! Alocação de variáveis
	allocate ( xv(Nvt), yv(Nvt), xc(Nt), yc(Nt), xcf(Ntf), ycf(Ntf), vert(Nt,4), vertf(Ntf,4), Sp(Nt) )

	! Malha criada por segmentos de reta
	call malha_segmentos_retas

	! Valores padrão para delta ksi e delta eta
	d_ksi = 1.0d0
	d_eta = 1.0d0


	select case (tipo_malha)
	case (2)  ! Malha a ser gerada por equações elípticas
		call entrada_eliptica

		! Alocação de variáveis
		allocate ( x_eta(Nvt), x_ksi(Nvt),  y_eta(Nvt), y_ksi(Nvt) )
		allocate ( alpha(Nvt), beta (Nvt),  gama (Nvt), Jac(Nvt)   )
		allocate ( ap(Nvt),    ae(Nvt),     aw(Nvt),    an(Nvt),   as(Nvt), &
			       ane(Nvt),   anw(Nvt),    ase(Nvt),   asw(Nvt)   )
		allocate ( P(Nvt),     Q(Nvt)       )


		do iter = 1, itmax

			! Cálculo das métricas
			call metricas_aproximadas

			! Determinação das funções P e Q
			call funcoes_P_Q

			! Cálculo de coeficientes
			call coef_internos

			! Solução numérica (posição x)
			call gauss_seidel(xv,ap,ae,aw,an,as,ane,anw,ase,asw,Nv1,Nv2,Nt,itsolver)

			! Solução numérica (posição y)
			call gauss_seidel(yv,ap,ae,aw,an,as,ane,anw,ase,asw,Nv1,Nv2,Nt,itsolver)

		end do

	end select

	! Cálculo dos centroides
	call centroides

	! Abertura do arquivo de saída de dados
	call saidas

	! Escrita de dados para permitir uso em códigos de malhas não-estruturadas
	select case (nest)
	case (2)

		allocate ( conec(4,Nt) )

		! Cálculo dos centroides, volumes fictícios (malhas não-estruturadas)
		!call centroides_fict_nest

		! Cálculo das conectividades
		call conectividades
		!call conectividades_fict

		! Abertura de arquivos de saída de dados (malhas não-estruturadas)
		call saidas_nao_estruturada

	end select

end program