% Diffusion equation - 2D - Explicit Method
% Neumann BC conditions - Constant heat flux at boundaries

clc
clf
clear 

% Inputs
alpha = 1e-4; % Thermal diffusivity of copper, m2/s (Heat Conduction - Ozisik & Hahn)
kt = 386; % Thermal conductivity of copper, W/(m k)
t = 100; % total time, s eg. 1, 100 s
delta_t = t/100; % timestep, s eg. t/10, t/100 s
xlength = 0.3; % xlength = yheight, m eg 0.3  m
delta_x = xlength/10; % delta_x = xlenght/3, xlength/10 m
delta_y = delta_x; % delta_x = delta_y, m
q1y = -38600; % heat flux, W/m2 eg 38600
q2x = 38600; % heat flux, W/m2 eg 38600
q3y = 38600; % heat flux, W/m2 eg -38600
q4x = -38600; % heat flux, W/m2 eg -38600
f1y = q1y/kt; % Thermal gradient, K/m or heat flux, q / thermal conductivity, k, W/m2 / (W/(m K)) (typ)
f2x = q2x/kt;
f3y = q3y/kt;
f4x = q4x/kt;
Tin = 20; % Initial Conditions, Temperatures, deg.C (typ)
% Tmax = max([T1,T2,T3,T4,T5]);

% Solution
n = ((xlength/delta_x) + 1)^2; % no. of interior points
m = sqrt(n); % no. of points in a row / column
r = t/delta_t; % no. of time steps
d = alpha*delta_t/delta_x^2; % diffusion number

if d < 0.25
    fprintf('solution stable\nd = %8.4f', d)
else
    fprintf('solution unstable\nd = %8.4f', d)
end


T = zeros(m,m,r);

% Initial Conditions
T(:,:,1) = Tin;

% Creating T matrix

for k = 1:r-1
   for i = 1:m
      for j = 1:m
          
          % BCs
          if ((i == 1) && (j > 1) && (j < m))
          T(i,j,k+1) = T(i,j,k) + d*( T(i,j-1,k) + T(i,j+1,k) + 2*T(i+1,j,k) + 2*delta_y*f1y - 4*T(i,j,k) );
          elseif ((j == m) && (i > 1) && (i < m))
          T(i,j,k+1) = T(i,j,k) + d*( T(i-1,j,k) + T(i+1,j,k) + 2*T(i,j-1,k) - 2*delta_x*f2x - 4*T(i,j,k) );
          elseif ((i == m) && (j > 1) && (j < m))
          T(i,j,k+1) = T(i,j,k) + d*( T(i,j-1,k) + T(i,j+1,k) + 2*T(i-1,j,k) - 2*delta_y*f3y - 4*T(i,j,k) );
          elseif ((j == 1) && (i > 1) && (i < m))
          T(i,j,k+1) = T(i,j,k) + d*( T(i-1,j,k) + T(i+1,j,k) + 2*T(i,j+1,k) + 2*delta_x*f4x - 4*T(i,j,k) );
          elseif ((i == 1) && (j == 1))
          T(i,j,k+1) = T(i,j,k) + d*( 2*T(i,j+1,k) + 2*T(i+1,j,k) + 2*delta_x*f4x + 2*delta_y*f1y - 4*T(i,j,k) );
          elseif ((i == 1) && (j == m))
          T(i,j,k+1) = T(i,j,k) + d*( 2*T(i,j-1,k) + 2*T(i+1,j,k) + 2*delta_y*f1y - 2*delta_x*f2x - 4*T(i,j,k) );
          elseif ((i == m) && (j == m))
          T(i,j,k+1) = T(i,j,k) + d*( 2*T(i-1,j,k) + 2*T(i,j-1,k) - 2*delta_x*f2x - 2*delta_y*f3y - 4*T(i,j,k) );
          elseif ((i == m) && (j == 1))
          T(i,j,k+1) = T(i,j,k) + d*( 2*T(i-1,j,k) + 2*T(i,j+1,k) - 2*delta_y*f3y + 2*delta_x*f4x - 4*T(i,j,k) );
          else 
          % Interior Nodes
          T(i,j,k+1) = T(i,j,k) + d *( T(i+1,j,k) + T(i-1,j,k) + T(i,j+1,k) + T(i,j-1,k) - 4*T(i,j,k) );
          end

      end
   end
end
 
Tmat_1 = T(:,:,1);
Tmat_2 = T(:,:,2);
T(:,:,r);


% Temperature Profile
T11 = T
% T11 = rot90(T);
Tmax = max(T(:));
Tmin = min(T(:));


% Initial Temperature Profile
subplot(2,2,1)
% T13 = rot90(T13);
T13 = imagesc(T11(:,:,1));
colorbar;
title(['Temperature Profile  ', ' flux q1y = ', num2str(q1y),' W/m2', ' / Thermal Gradient f1y = ', num2str(f1y),' K/m'])
xlabel(['q3y = ' num2str(q3y),' W/m2', '; Tinitial = ' num2str(Tin),' C', ' / Thermal Gradient f3y = ', num2str(f3y),' K/m'])

yyaxis left
ylabel(['q4x = ' num2str(q4x),' W/m2', ' / Thermal Gradient f4x = ', num2str(f4x),' K/m'])
yyaxis right
set(gca,'ytick',[])
ylabel(['q2x = ' num2str(q2x),' W/m2', ' / Thermal Gradient f2x = ', num2str(f2x),' K/m'])


% Final Temperature Profile
subplot(2,2,3)
T12 = imagesc(T11(:,:,r));
colorbar;
title(['Temperature Profile  ', ' flux q1y = ', num2str(q1y),' W/m2', ' / Thermal Gradient f1y = ', num2str(f1y),' K/m'])
xlabel(['q3y = ' num2str(q3y),' W/m2', '; Tinitial = ' num2str(Tin),' C', ' / Thermal Gradient f3y = ', num2str(f3y),' K/m'])

yyaxis left
ylabel(['q4x = ' num2str(q4x),' W/m2', ' / Thermal Gradient f4x = ', num2str(f4x),' K/m'])
yyaxis right
set(gca,'ytick',[])
ylabel(['q2x = ' num2str(q2x),' W/m2', ' / Thermal Gradient f2x = ', num2str(f2x),' K/m'])

% Temperature Profile - Animation
x = 1:m;
y = 1:m;
T21 = T(:,:,1);

%{
Tmax = 0;
for k = 1:r
    for i = 1:m
        for j = 1:m
            T31 = T(:,:,k);
            T32 = T31(:);
            Tmax1 = max(T32);
         end
    end
    if Tmax <= Tmax1
        Tmax = Tmax1;
    else
        Tmax = Tmax;
    end
end
            
Tmax; 
%}


for k = 1:r
    subplot(1,2,2)
    colorbar;
    h=surf(x,y,T21,'EdgeColor','none');   
    shading interp
    axis ([0 m 0 m Tmin Tmax]);
    title({['Transient Heat Conduction - Explicit - Neumann BCs'];['time (\itt) = ',num2str(k*delta_t),' s']})
    colorbar;
    drawnow; 
    pause(0.001);    
    refreshdata(h);
    if k ~= r
    T21 = T(:,:,k+1);
    else 
        break;
    end
end

                
        
    