module dados

use variaveis
use portlib

implicit none

contains

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

subroutine entrada_geral
	
	dos = system('notepad dados_poisson.txt')

	open(1,file = 'dados_poisson.txt')

	read(1,*) nome_entrada
	read(1,*) nome_saida
	read(1,*) prob
	read(1,*) itsolver
	read(1,*) itmax
	read(1,*) esc_metr
	read(1,*) esc_coef

	close(1)

end subroutine entrada_geral

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

subroutine entrada_malha

	open(1,file=trim(adjustl(nome_entrada)) // '.txt')

	read(1,*) N1, N2, Nv1, Nv2, tipo_malha

	! 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
	Nvt = Nv1*Nv2

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

	! Leitura dos valores de d_eta e d_ksi
	read(1,*) d_eta, d_ksi

	! Leitura da posição dos vértices (malha)
	do i = 1, Nvt
		
		read(1,*) xv(i), yv(i)

	end do

	close(1)

	! Leitura dos vértices que formam dado volume (com fictícios)
	
	vertf = 0
	
	open(2,file = trim(adjustl(nome_entrada)) // '_vert_fict.txt')
	
	do i = 1, Nt
		
		read(2,*) aux2, vertf(aux2,1), vertf(aux2,2), vertf(aux2,3), vertf(aux2,4)

	end do

	close(2)

	! Leitura dos centroides dos volumes reais 
	
	xc = 0
	yc = 0
	
	open(3,file = trim(adjustl(nome_entrada)) // '_cent_fict.txt')

	do i = 1, Ntf
		
		read(3,*) xc(i), yc(i)

	end do


end subroutine entrada_malha

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

subroutine saida_dados

	aux1 = len(trim(adjustl(nome_entrada))//'.txt')

	open(1,file = trim(adjustl(nome_saida)) // '.txt')

	write(1,10)

	! Problema solucionado: 1 - Laplace linear; 2 - Poisson
	select case (prob)
	case(1)
		write(1,11) 
	case(2)
		write(1,12)
	end select

	! Tipo de malha empregada: 1 - segmentos de reta; 2 - sol. de eqs. elípticas
	select case (tipo_malha)
	case(1)
		write(1,21)
	case(2)
		write(1,22)
	end select
	
	write(1,30) trim(adjustl(nome_entrada))//'.txt', N1, N2, Nt, itsolver, itmax

	! Escrita de métricas
	select case (esc_metr)
	case (1)

	write(1,32)

	do i = 1, Ntf

		write(1,33) i, xe_ksi(i), ye_ksi(i), xn_ksi(i), yn_ksi(i), xe_eta(i), ye_eta(i), xn_eta(i), yn_eta(i)

	end do


	write(1,35)

	do i = 1, Ntf

		write(1,36) i, alpha(i), gama(i), betae(i), betan(i), Jp(i), Je(i), Jn(i)

	end do

	end select


	! Escrita de coeficientes
	select case (esc_coef)
	case (1)

	write(1,40)

	do i = 1, Ntf

		write(1,50) i, ap(i), ae(i), aw(i), an(i), as(i), ane(i), anw(i), ase(i), asw(i), bp(i)
	
	end do

	end select

	! Escrita do campo de temperaturas
	write(1,60)

	do i = 1, Ntf
		
		write(1,70) xc(i), yc(i), T(i), Ta(i)

	end do

	! Temperatura média
	write(1,80) Tm_num, Tm_an
	
	close (1)
	
	dos = system('notepad ' // trim(adjustl(nome_saida)) // '.txt')

	10 format ("Solução Numérica de Difusão de Calor 2D em regime permanente, em meio com prop. constantes, utilizando malha não-ortogonal" )
	11 format ( /, " Problema resolvido: 1 - Laplace linear", &
	            /, " Solução analítica: T(x,y) = x*y ")
	12 format ( /, " Problema resolvido: 2 - Poisson senoidal", &
	            /, " Solução analítica: T(x,y) = sin(pi*x/2)*sin(pi*y/2) ")
	21 format ( /, " Malha utilizada gerada por segmentos de reta" )
	22 format ( /, " Malha utilizada gerada através da solução de eqs. elípticas" )
	
	30 format ( /, t2, a<aux1>, " = nome_entrada: nome do arquivo com dados sobre a malha empregada", /, &
	            /, i12, t15, " = N1: Número de volumes (reais) na direção ksi", &
	            /, i12, t15, " = N2: Número de volumes (reais) na direção eta", &
				/, i12, t15, " = Nt: Número total de volumes (reais)", &
			   2/, i12, t15, " = itsolver: Número de iterações internas do solver", &
				/, i12, t15, " = itmax:    Número máximo de iterações externas" )
	32 format (2/, t10, "Métricas de malha de todos os volumes (inclusive fictícios) - derivadas", /, &
	            /, t10, "(i)", t18, "x_ksi_e(i)", t33, "y_ksi_e(i)", t48, "x_ksi_n(i)", t63, "y_ksi_n(i)", t78, "x_eta_e(i)", t93, "y_eta_e(i)", t108, "x_eta_n(i)", t123, "y_eta_n(i)" )
	33 format ( i12, 8(1pe15.4) )
	35 format (2/, t10, "Métricas de malha de todos os volumes (inclusive fictícios) - componentes do tensor métrico e jacobianos", /, &
	            /, t10, "(i)", t18, "alpha(i)", t33, "gama(i)", t48, "beta_e(i)", t63, "beta_n(i)", t78, "Jp(i)", t93, "Je(i)", t108, "Jn(i)" )
	36 format ( i12, 7(1pe15.4) )	
	40 format (2/, t10, "Coeficientes e termos-fontes de todos os volumes (inclusive fictícios)", /, &
	            /, t10, "(i)", t18, "ap(i)", t33, "ae(i)", t48, "aw(i)", t63, "an(i)", t78, "as(i)", t93, "ane(i)", t108, "anw(i)", t123, "ase(i)", t138, "asw(i)", t153, "bp(i)" )
	50 format ( i12, 10(1pe15.4) )
	60 format ( /, t5, "Campo de temperaturas (volumes reais)", /,  &
	            /, t5, "X [m]", t30, "Y[m]", t55, "Temp. numérica [°C]", t80, "Temp. analítica [°C]" )
	70 format ( 4(1pe25.15) )
	80 format ( /, 1pe25.15, t30, " = Tm_num: Temperatura média numérica [°C]", &
	            /, 1pe25.15, t30, " = Tm_an:  Temperatura média analítica [°C]" )

end subroutine saida_dados

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

end module dados