Week 5.1 - Mid term project - Solving the steady and unsteady 2D heat conduction problem
Steady-state 2D heat conduction equation:
`(delta^2T)/(delta^2x)+(delta^2T)/(delta^2y)=0`
This equation can be solved using three iterative methods such as Jacobi, Gauss-Seidel and SOR.



MATLAB PROGRAM
FUNCTIONS FOR JACOBI
function [T jacobi_iter] = Steady_2D_Heat_Conduction_jacobi(dx,dy,T,error_tol,k,error,nx,ny)
Told = T;
jacobi_iter = 1;
while (error>error_tol)
% Space Loop
for i=2:nx-1
for j=2:ny-1
term1 = (Told(i-1,j)+Told(i+1,j))/(k*(dx^2));
term2 = (Told(i,j-1)+Told(i,j+1))/(k*(dy^2));
T(i,j) = term1+term2;
end
end
%error = max(abs(T(i,j)-Told(i,j)));
error = max(max(abs(T-Told)));
Told = T;
jacobi_iter = jacobi_iter+1;
end
end
FUNCTIONS FOR GAUSS-SEIDAL
function [T GS_iter] = Steady_2D_Heat_Conduction_GS(dx,dy,T,error_tol,k,error,nx,ny)
Told = T;
GS_iter = 1;
while (error>error_tol)
% Space Loop
for i=2:nx-1
for j=2:ny-1
term1 = (T(i-1,j)+T(i+1,j))/(k*(dx^2));
term2 = (T(i,j-1)+T(i,j+1))/(k*(dy^2));
T(i,j) = term1+term2;
end
end
%error = max(abs(T(i,j)-Told(i,j)));
error = max(max(abs(T-Told)));
Told = T;
GS_iter = GS_iter+1;
end
end
FUNCTIONS FOR Successive Over Relaxation
function [T SOR_iter] = Steady_2D_Heat_Conduction_SOR(dx,dy,T,error_tol,k,error,nx,ny)
Told = T;
r = 1.5;
SOR_iter = 1;
while (error>error_tol)
% Space Loop
for i=2:nx-1
for j=2:ny-1
term1 = (T(i-1,j)+T(i+1,j))/(k*(dx^2));
term2 = (T(i,j-1)+T(i,j+1))/(k*(dy^2));
T(i,j) = (1-r)*Told(i,j) + r*(term1+term2);
end
end
%error = max(abs(T(i,j)-Told(i,j)));
error = max(max(abs(T-Told)));
Told = T;
SOR_iter = SOR_iter+1;
end
end
Main Script
clc
clear all
close all
%Inputs
nx = 10;
ny = nx;
x = linspace(0,1,nx);
y = linspace(0,1,ny);
dx = x(2)-x(1);
dy = y(2)-y(1);
error_tol = 1e-4;
error = 1e5;
%IC & BC
T = 300*ones(nx,ny);
T(1,:) = 600;
T(nx,:) = 900;
T(:,1) = 400;
T(:,ny) = 800;
T(1,1) = mean([400,600]);
T(1,ny) = mean([600,800]);
T(nx,1) = mean([400,900]);
T(nx,ny) = mean([900,800]);
Told = T;
k=2*((dx^2+dy^2)/(dx^2*dy^2));
%Jacobi Solver
iterative_solver = input('Enter the desired number with respect to solver:');
if iterative_solver==1
tic;
[T, jacobi_iter] = Steady_2D_Heat_Conduction_jacobi(dx,dy,T,error_tol,k,error,nx,ny); %Function
time_jacobi_in_sec=toc;
figure(1)
contourf(x,y,T)
clabel(contourf(x,y,T))
colorbar
colormap(jet)
set(gca, 'ydir', 'reverse')
title(sprintf('No. of Jacobi Iterations = %d', jacobi_iter))
% Gauss-Seidal Solver
elseif iterative_solver==2
tic;
[T GS_iter] = Steady_2D_Heat_Conduction_GS(dx,dy,T,error_tol,k,error,nx,ny); %Function call
time_GS_in_sec = toc;
figure(1)
contourf(x,y,T)
clabel(contourf(x,y,T))
colorbar
colormap(jet)
set(gca, 'ydir', 'reverse')
title(sprintf('No. of Gauss-Siedel = %d', GS_iter))
% SOR Solver
elseif iterative_solver==3
tic;
[T, SOR_iter] = Steady_2D_Heat_Conduction_SOR(dx,dy,T,error_tol,k,error,nx,ny); %Function Call
time_GS_in_sec = toc;
figure(1)
contourf(x,y,T)
clabel(contourf(x,y,T))
colorbar
colormap(jet)
set(gca, 'ydir', 'reverse')
title(sprintf('No. of Successive Over-Relaxation Iterations = %d',SOR_iter))
end
xlabel('X-Axis')
ylabel('Y-Axis')
OUTPUT
JACOBI SOLVER OUTPUT

GAUSS-SEIDAL SOLVER OUTPUT

SUCCESSIVE OVER RELAXATION SOLVER OUTPUT

IMPLICIT Scheme Unsteady/Transient-state Condition Program:
The unsteady/transied 2d heat conduction equation is given by

MATLAB CODE
%% 2D HEAT CONDUCTION ON A FLAT PLATE - TRANSIENT STATE
clear all
close all
clc
%INPUTS
nx = 10;
ny = 10;
x = linspace(0,1,nx);
y = linspace(0,1,ny);
dx = x(2)-x(1);
dy = y(2)-y(1);
% IC & BC
T = 300*ones(nx,ny);
TL = 400;
TR = 800;
TT = 600;
TB = 900;
T(:,1) = TL;
T(:,end) = TR;
T(1,:) = TT;
T(end,:) = TB;
T(1,1) = 0.5*(TL+TT);
T(1,nx) = 0.5*(TR+TT);
T(ny,1) = 0.5*(TL+TB);
T(nx,ny) = 0.5*(TR+TB);
tol = 1e-4;
Terror = 1;
% CFL
dt = 1;
alpha = 1e-5;
k1 = alpha*dt/dx^2;
k2 = alpha*dt/dy^2;
omega=2/(1+sin(pi*dx));
CFL = k1+k2;
% Copy Previous time matrix
T_prev = T;
T_old = T;
% Initial matrix
T_initial = T;
% IMPLICIT SOLVER
Titer = 0;
Siter = 0;
tspan = 0;
Serror = 1;
iterative_solver = input('input the appropriate number to select required the method:');
%% JACOBI METHOD
if iterative_solver==1
% TIME LOOP
% CONVERGENCE criterion for time
while(Terror>tol)
Titer = Titer+1;
Serror = 1;
% SPACE LOOP - JACOBIAN
while(Serror>tol)
for j = 2:ny-1
for i = 2:nx-1
% Current time level but old iteration neighbours
TL = T_old(i,j-1); TR = T_old(i,j+1); TT = T_old(i-1,j); TB = T_old(i+1,j);
H = TL + TR; V = TT + TB; k1k2 = (1+2*k1+2*k2);
T(i,j) = (T_prev(i,j) + H*k1 + V*k2)/k1k2;
end
end
Siter = Siter+1;
Serror(Siter) = max(max(abs(T-T_old)));
T_old = T;
end
tspan = tspan + (dt*Titer);
Terror(Titer) = max(max(abs(T-T_prev)));
T_prev = T;
end
%% GAUSS-SEIDAL METHOD
elseif iterative_solver==2
while(Terror>tol)
Titer = Titer+1;
Serror = 1;
% SPACE LOOP - GAUSS-SEIDAL
while(Serror>tol)
for j = 2:ny-1
for i = 2:nx-1
% Current time level but old iteration neighbours
term1 = (1+(2*k1)+(2*k2))^-1;
term2= k1*term1;
term3= k2*term1;
H=(T(i-1,j)+T_old(i+1,j));
v=(T(i,j-1)+T_old(i,j+1));
T(i,j)= T_prev(i,j)*term1+term2*H+term3*v;
end
end
Siter = Siter+1;
Serror(Siter) = max(max(abs(T-T_old)));
T_old = T;
end
tspan = tspan + (dt*Titer);
Terror(Titer) = max(max(abs(T-T_prev)));
T_prev = T;
end
%% SUCCESSIVE 0VER RELAXATION METHOD
elseif iterative_solver==3
while(Terror>tol)
Titer = Titer+1;
Serror = 1;
% SPACE LOOP - SUCCESSIVE OVER RELAXATION
while(Serror>tol)
for j = 2:ny-1
for i = 2:nx-1
% Current time level but old iteration neighbours
term1 = (1+(2*k1)+(2*k2))^-1;
term2= k1*term1;
term3= k2*term1;
H=(T(i-1,j)+T_old(i+1,j));
v=(T(i,j-1)+T_old(i,j+1));
T(i,j)= omega*(T_prev(i,j)*term1+term2*H+term3*v)+(1-omega)*T_prev(i,j);
end
end
Siter = Siter+1;
Serror(Siter) = max(max(abs(T-T_old)));
T_old = T;
end
tspan = tspan + (dt*Titer);
Terror(Titer) = max(max(abs(T-T_prev)));
T_prev = T;
end
end
%Plotting
figure(1)
contourf(x,y,T)
clabel(contourf(x,y,T))
colorbar
colormap(jet)
set(gca, 'ydir', 'reverse')
xlabel('X-Axis')
ylabel('Y-Axis')
title(sprintf('No. of Unsteady Iterations(EXPLICIT) = %d', Titer));
OUTPUT OF CODE
JACOBI OUTPUT

GAUSS-SEIDAL OUTPUT

SUCCESIVE OVER RELAXATION OUTPUT

EXPLICIT Scheme Unsteady/Transient-state Condition Program:

MATLAB CODE:
%% 2D HEAT CONDUCTION ON A FLAT PLATE - TRANSIENT STATE
clear all
close all
clc
%% 1) EXPLICIT METHOD
nx = 10;
ny = 10;
x = linspace(0,1,nx);
y = linspace(0,1,ny);
dx = x(2)-x(1);
dy = y(2)-y(1);
T = 300*ones(nx,ny);
TL = 400;
TR = 800;
TT = 600;
TB = 900;
T(:,1) = TL;
T(:,end) = TR;
T(1,:) = TT;
T(end,:) = TB;
T(1,1) = 0.5*(TL+TT);
T(1,nx) = 0.5*(TR+TT);
T(ny,1) = 0.5*(TL+TB);
T(nx,ny) = 0.5*(TR+TB);
tol = 1e-4;
error = 1;
% CFL
dt = 1e-2;
CFL = 0.1;
alpha = (CFL*dx^2)/dt;
k1 = alpha*dt/dx^2;
k2 = alpha*dt/dy^2;
% Copy
% Previous time matrix
T_prev = T;
% Current time matrix
T_initial = T;
% EXPLICIT SOLVER
iter = 0;
tspan = 0;
% CONVERGENCE criterion for time
while(error>tol) % FOR LOOP (Repeats until nt)
for j = 2:ny-1
for i = 2:nx-1
% Previous time level neighbours
TL = T_prev(i,j-1); TR = T_prev(i,j+1); TT = T_prev(i-1,j); TB = T_prev(i+1,j);
H = TL + TR; V = TT + TB;
k1k2 = 1-2*k1-2*k2;
T(i,j) = T_prev(i,j)*k1k2 + H*k1 + V*k2;
end
end
iter = iter+1;
tspan = tspan + (dt*iter);
error(iter) = max(max(abs(T-T_prev)));
T_prev = T;
end
%Plotting
figure(1)
contourf(x,y,T)
clabel(contourf(x,y,T))
colorbar
colormap(jet)
set(gca, 'ydir', 'reverse')
xlabel('X-Axis')
ylabel('Y-Axis')
title(sprintf('Unsteady 2D heat conduction - Explicit Method, Iterations = %d',iter));
OUTPUT

RESULTS/DISCUSSION:
- In Steady state equation, SOR methods yields the reults very quickly when compare to other two methods.whereas Jacobi takes more number of iterations and more time to solve the unknows.
- Jacobi > Gauss-seidel > Successive over-relaxation according to the No. of iterations computed
- So, the SOR method is most efficient when compared to the other two methods to solve the steady-state equation.
- When comparing Steady state and Unsteady state, it is proven that Steady state is the most successful one as it takes least number of iterations and least time to compute.
- In transient state equation, explicit methods yield the results quickly when compared to the implicit method, but is recommended under the situation when CFL is less than 0.25.