%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Desenvolvido por Leonardo M. N. de Mattos. %
% www.mattos.eng.br                          %
% l (at) mattos.eng.br                       %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clc; % Limpa a tela
format short eng; % formato de saída dos números
clear all; % limpa todas as variáveis

t0 = cputime; % marca tempo inicial de cpu
deltax = 5e-3; % discretizacao em x [m]
deltay = deltax; % discretizacao em y [m] 
passo = 1e-5; % variação do tempo [s]
alpha = 2; % difusividade térmica [m^2/s]
Fo = (alpha*passo)/deltax^2; %
erro = 1e-5; % critério de parada
Td = 100; % temperatura da borda superior [C]
minIt = 1000; % Número minimo de iterações
posMed = .2; % Posicao da medição
geraVideo = 0; % Opção Selecionada Para Gerar Imagens para Video

H = 3; % altura do retângulo [m]
L = 1; % comprimento do retângulo [m]

% construção do dominio
fprintf('construindo o dominio... ');
dominio = ci_ret(H,L,deltax,deltay); 
fprintf('OK!\n')

% processamento
dominio_novo = Tprox_ret(dominio,Fo,deltax,deltay,L,H);    
pAval = dominio_novo((H/deltay)*posMed,(L/deltax)*.5);
fprintf('Iniciando o processamento...\n');
h = figure(1);
for k = 1:1e100
    %caso a opcao gera video estiver selecionada, gera imagem para video
    if geraVideo == 1
        image(dominio_novo);
        title('Transferência de Calor numa placa - Método das Diferenças Finitas');
        nomeArquivo = sprintf('video/video%i.png',k);
        saveas(h,nomeArquivo);
    end        
    
    %calcula novas temperaturas do dominio
    dominio_novo = Tprox_ret(dominio_novo,Fo,deltax,deltay,L,H);
        
    % testa se a placa já entrou em regime permanente
    if (abs(pAval - dominio_novo((H/deltay)*posMed,(L/deltax)*.5))...
            < erro) && (k > minIt)
        close(h);
        fprintf('Critério de parada atingido!\n');
        fprintf('Erro configurado: %f\n',erro);
        fprintf('Quantidade de iterações %i\n',k+1);
        fprintf('Quantidade de nós: %i\n',(L/deltax)*(H/deltay));
        break
    end
    pAval = dominio_novo((H/deltay)*posMed,(L/deltax)*.5);
end
fprintf('Fim do processamento!\n');

% verificar temperatura de uma linha
Tteo = zeros(1);
for k = 0:(L/deltay)-1
     Tteo(k+1) = Tanalitica(k,(H/deltay)*(1-posMed),H/deltay,L/deltax,Td);
end    

% calcula tempo total de processamento
ttotal = cputime - t0; % para relogio
fprintf('Tempo total: %f\n cputime',ttotal);

%plotar gráficos
h3 = figure(1);
image(dominio_novo);
title('Transferência de Calor numa placa - Método das Diferenças Finitas');
% saveas(h3,'permanente.fig');
% saveas(h3,'permanente.png');

h2 = figure(2);
plot(0:((L/deltax)-1),Tteo,'-.r*'); 
hold on;
plot(0:((L/deltax)-1),dominio_novo((H/deltay)*posMed,:));
hold off;
title('Solução Analítica x Solução Numérica');
legend('Solução Analítica','Solução Numérica');
xlabel('Posição na placa')
ylabel('Temperatura ºC')
% saveas(h2,'Tanalitica.fig');
% saveas(h2,'Tanalitica.png');
