module escreve_resultados

use declara_variaveis 

implicit none

contains

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

subroutine mostra_dados

allocate ( u_exata(nxy), v_exata(nxy), errou(nxy), errov(nxy) )

u_exata = 0.0d0

v_exata = 0.0d0

errou = 0.0d0

errov = 0.0d0

f_a = 0.0d0

f_n = 0.0d0

! Escreve dados do programa e do modelo matemático
    
	write(10,02) 

	02 format(2/, '***** Dados gerais *****')

	write(10,03) 

	03 format('Programa Fortran 2008- versao 9.1 INTEL')

	write(10,04) 

	04 format('Projeto console - realese')

	write(10,05) 

	05 format('Computador CFD 14')

	write(10,06) 

	06 format('Precisao dupla')	

	write(10,07) 	 


	07 format(2/, '******************** Dados do Modelo Matemático ******************** ')
            				
	write(10,08) 

	08 format('Equacoes de Burguers 2D: ro*(d2(u^2)/dx + d2(uv)/dy) = mi*(d2u/dx2 + d2u/dy2) - dp/dx &
                        ro*(d2(uv)/dx + d2(v^2)/dy) = mi*(d2v/dx2 + d2v/dy2) - dp/dy - S(x,y,Re = 1)')

!************************************* Escreve dados do multigrid ************************************************

	if (nm /= 1) then
	
		write(10,09)
			 
		09 format(2/, '***************************** Dados do Multigrid ******************************',  &					   
   
	 	            1/, 'Algoritmo                    : FAS',&
		            1/, 'Ciclo                          :  V', &					
		           1/, 'Prolongação                : Interpol. Bi-linear'&
		           1/, 'Tipo de malhas            : Malhas uniformes por direção')

	end if

!************************************* Escreve dados de entrada *************************************************

	write(10,10) trim(adjustl(title)), trim(adjustl(caso)), Lx, Ly, nm, nxg(nm), nyg(nm), nxyg(nm),tol, itemax, itimax_fmg,itimax, Re, w
    
	10 format(/,'título = ',a,//, 5x,'DADOS',/,  &
                           
                               a,'   =  caso: nome do experimento numérico',/, &
  	                      1pe17.1'   =  comprimento do domínio de cálculo na direção x'/,&
     	                  1pe17.1'   =  comprimento do domínio de cálculo na direção y'/,&
                         i11,4x,'    =  nm: número de malhas',/, &
                         i11,4x,'    =  nxg(nm): número de pontos na direção X (malha mais fina) com contornos',/, &
                         i11,4x,'    =  nyg(nm): número de pontos na direção Y (malha mais fina) com contornos',/, &
                         i11,4x,'    =  nxyg(nm): número total de pontos (malha mais fina) com contornos',/, &
                        1pe17.1,'    =  tol: tolerância do problema',/, &
                         i11,4x,'    =  itemax: número máximo de iterações externas (ciclos V)',/, &
                         i11,4x,'    =  iteimax_fmg: número máximo de iterações externas (ciclos V)',/, &
                         i11,4x,'    =  itimax: número máximo de iterações internas (Gauss-Seidel) lexicográfico',/, &
                        1pe17.1,'    =  Re: número de Reynolds',/, &
                         i11,4x,'    =  w: freqüência de escrita dos resíduos e variáveis nas iterações')

!************************************* Escreve malhas ************************************************************

	write (10, 11)
	 
	11 format(1/, t1, 'Nível', t15, 'malha em x     malha em y') 
					            
	do m = 1, nm 

	    write (10, 12) m, nxg(m)-2, nyg(m)-2
				
		12 format (i3, i15, i15 )
				   
	end do
 

!************************************* Escreve norma L1 *********************************************************
 	
 	write(10,16)

	16 format(2/, '**************************************** Norma **********************************************')

	write(10,45) normai_u(0)
	
	write(10,46) normai_v(0)
	
	45 format(1/, 'normai_u(0) da estimativa inicial: ', 1pe25.16 )
	
	46 format(1/, 'normai_v(0) da estimativa inicial: ', 1pe25.16 )

	write(10,17)
    
    17 format(2/, t14,'ii',t24,'normai_u(ii)', t42,'normai_u(ii)/normai_u(0)',t74,'normai_v(ii)',t92,'normai_v(ii)/normai_v(0)',/)
 
    do i = 1,min(ii,itemax)
    
    	write(10,55) i, normai_u(i), normai_u(i)/normai_u(0), normai_v(i), normai_v(i)/normai_v(0)	

    end do
    
    55 format(i14,1pe25.16,1pe25.16,1pe25.16,1pe24.16)

!************************************* Escreve tempo de CPU *****************************************************
  

	write(10,15) tcpu

	15 format(/, f14.3, ' = tempo de CPU (segundos)')
	
	write(10,25) tcpu2-tcpu1

	25 format(/, f14.3, ' = tempo total (segundos)')
	
	write(10,35) repete

	35 format(/, i14,' = no. de repetições')
	
 
    write(10,39) (normai_u(min(itemax,ii))/normai_u(0))**(1.0d0/(min(itemax,ii)))

    write(10,39) (normai_v(min(itemax,ii))/normai_v(0))**(1.0d0/(min(itemax,ii)))

    39  format(/'Fator de convergência médio u                       : ', 1pe25.16)

    40  format(/'Fator de convergência médio v                       : ', 1pe25.16)

 
!************************************* Escreve Ta e Erro ********************************************************
! Calcula o valor analítico das velocidades u e v (analítico - numérico)	

x1 = 0.5d0*dx

y1 = x1  !0.5d0*dy


	do j = 2,ny-1

		y = y1 +(j-2)*dy

        k1 = (j-1)*nx + nva
        
		do i = 2, nx-1
				 
				x = x1 +(i-2)*dx     
								
				nv = k1 + i
				
					u_exata(nv-nva) = 8.0d0*(x**4 - 2.0d0*x**3 + x**2)*(4.0d0*y**3 - 2.0d0*y)  

					v_exata(nv-nva) = -8.0d0*(4.0d0*x**3 - 6.0d0*x**2 + 2.0d0*x)*(y**4 - y**2) 
					
				    errou(nv-nva) = u_exata(nv-nva)-u(nv)

					errov(nv-nva) = v_exata(nv-nva)-v(nv)				
						
		end do
										
	end do


	write(10,13)  maxval(abs(errou))    
		

	13 format(1/, 'Norma infinito (u_analitica - u_numerica)           : ', 1pe25.16)

 
    write(10,61)  maxval(abs(errov))      
 

    61 format(1/, 'Norma ifinito (v_analitica - v_numerica)            : ', 1pe25.16)


 
    !Força da tampa da cavidade sobre o fluido (volumes do contorno norte)

    ! Numérico  
     
   f_n = 0.0d0
    
    k5 = nx*(ny-1)
    
    do i = nva+2, nva+nx-1 !2, nx-1                     
     
       nv = k5 + i  		  
			  
			  f_n = f_n + ( u(nv) - u(nv-nx) )! regra do retangulo F = mi*dz*dx/dy*soma( u(norte)-u(ponto) )			      
    
    end do
		
  
    ! Analítico
    
      f_a = 8.0d0/3   ! 8*mi/3
    
    
    write(10,62)  f_n
		
    62  format(/'Força da tampa da cavidade sobre o fluido(numerico) : ', 1pe25.16)
	
	write(10,63) f_a
	
	63  format(/'Força da tampa da cavidade sobre o fluido(analitico): ', 1pe25.16)
 
	write(10,64) abs(f_a - f_n)
	
	64  format(/'Erro no cálculo da força da tampa sobre o fluido    : ', 1pe25.16) 	  
    
       
end subroutine mostra_dados

!********************************************************************************************************
end module escreve_resultados