Week 5.1 - Mid term project - Solving the steady and unsteady 2D heat conduction problem
The equation given is:`(delT)/(delt)+alpha((del^2T)/(delx^2)+(del^2T)/(dely^2))=0`
For Steady state case, this will reduce to:`(del^2T)/(delx^2)+(del^2T)/(dely^2)=0`
The assumtions for solving the problem is:
nx=ny=10
Tempertaure for diffrent boundaries:
- Left=400K
- Top=600K
- Right=800K
- Bottom=900K
Tolerance=1e-4
Starting Error=9e9
`alpha`=1.88-5 `m^2/s`
The Steady state equation after applying central differencing method became:
`T(i,j)=1/K{((Told(i-1,j)+Told(i+1,j))/dx^2)+((Told(i,j-1)+Told(i,j+1))/dy^2)}`
`k=2*((dx^2+dy^2)/(dx^2*dy^2))`
Code for Solving the equations(steady state)
close all
clc
nx=10;
ny=nx;
x=linspace(0,1,nx);
y=linspace(0,1,ny);
dx=x(2)-x(1);
dy=y(2)-y(1);
[xx,yy]=meshgrid(x,y);
T=ones(nx,ny);
T(1,:)=900;
T(end,:)=600;
T(:,1)=400;
T(:,end)=800;
Told=T;
err_tot=1e-4;
strt_err=9e9;
k=2*((dx^2+dy^2)/(dx^2*dy^2));
T_jcob=jcob(strt_err,err_tot,xx,yy,nx,ny,dx,dy,T,k,Told);
T_gs=gs(strt_err,err_tot,x,y,nx,ny,dx,dy,T,k,Told);
T_sor=sor(strt_err,err_tot,x,y,nx,ny,dx,dy,T,k,Told);
Function code for SOR(steady)
function T=sor(strt_err,err_tol,x,y,nx,ny,dx,dy,T,k,Told)
sor_iter=1;
omega=1.7;
while(strt_err>err_tol)
for i=2:nx-1
for j=2:ny-1
T_gs=(((T(i-1,j)+Told(i+1,j))/dx^2)+((T(i,j-1)+Told(i,j+1))/dy^2))/k;
T(i,j)=omega*(T_gs)+(1-omega)*(Told(i,j));
end
end
strt_err=max(max(abs(Told-T)));
Told=T;
sor_iter=sor_iter+1;
figure(3)
[c,d]=contourf(x,y,T);
colormap(jet)
colorbar
title_txt=sprintf('SOR iteration number %d in staedy state',sor_iter);
title(title_txt)
xlabel('X-Axis')
ylabel('Y-Axis')
clabel(c,d)
pause(0.03)
end
fprintf('No of iterations in SOR %d',sor_iter);
end
Function code for Jacobi(steady)
function T=jcob(strt_err,err_tol,xx,yy,nx,ny,dx,dy,T,k,Told)
jcobi_iter=1;
while(strt_err>err_tol)
for i=2:nx-1
for j=2:ny-1
T(i,j)=(((Told(i-1,j)+Told(i+1,j))/dx^2)+((Told(i,j-1)+Told(i,j+1))/dy^2))/k;
end
end
strt_err=max(max(abs(Told-T)));
Told=T;
jcobi_iter=jcobi_iter+1;
figure(1)
[c,d]=contourf(xx,yy,T);
colormap(jet)
colorbar
title_txt=sprintf('Jacobi iteration number %d in staedy state',jcobi_iter);
title(title_txt)
xlabel('X-Axis')
ylabel('Y-Axis')
clabel(c,d)
pause(0.03)
end
fprintf('No of iterations in Jacobi %d',jcobi_iter);
end
Function code for Gauss-Seidal(steady)
unction T=gs(strt_err,err_tol,x,y,nx,ny,dx,dy,T,k,Told)
gs_iter=1;
while(strt_err>err_tol)
for i=2:nx-1
for j=2:ny-1
T(i,j)=(((T(i-1,j)+Told(i+1,j))/dx^2)+((T(i,j-1)+Told(i,j+1))/dy^2))/k;
end
end
strt_err=max(max(abs(Told-T)));
Told=T;
gs_iter=gs_iter+1;
figure(2)
[c,d]=contourf(x,y,T);
colormap(jet)
colorbar
title_txt=sprintf('Gauss Seidel iteration number %d in staedy state',gs_iter);
title(title_txt)
xlabel('X-Axis')
ylabel('Y-Axis')
clabel(c,d)
pause(0.03)
end
fprintf('No of iterations in Gauss Seidel %d',gs_iter);
end
Code for Solving the equations(transient state)
close all
clc
nx=41;
ny=nx;
x=linspace(0,1,nx);
y=linspace(0,1,ny);
dx=x(2)-x(1);
dy=y(2)-y(1);
dt=0.01;
alpha=1.88e-5;
[xx,yy]=meshgrid(x,y);
T=298*ones(nx,ny);
T(1,:)=900;
T(end,:)=600;
T(:,1)=400;
T(:,end)=800;
T(1,1)=(400+900)/2;
T(1,ny)=(900+800)/2;
T(nx,1)=(400+600)/2;
T(nx,ny)=(600+800)/2;
Told=T;
Tprev=Told;
err_tol=1e-4;
strt_err=9e+9;
k1=alpha*(dt/(dx^2));
k2=alpha*(dt/(dy^2));
omega=2/(1+sin(pi*dx));
CFL=alpha*(dt/(dx^2));
T_jcob=Trns_jcob(strt_err,err_tol,xx,yy,nx,ny,T,k1,k2,Told,Tprev);
T_gs=Trns_gs(strt_err,err_tol,xx,yy,nx,ny,T,k1,k2,Told,Tprev);
T_sor=Trns_sor(strt_err,err_tol,xx,yy,nx,ny,T,k1,k2,Told,Tprev,omega);
Function code for Jacobi(transient)
function T=Trns_jcob(strt_err,err_tol,xx,yy,nx,ny,T,k1,k2,Told,Tprev)
jcobi_iter=1;
for k=1:120000
while(strt_err>err_tol)
for i=2:nx-1
for j=2:ny-1
term1=(1+(2*k1)+(2*k2))^(-1);
term2=k1*term1;
term3=k2*term1;
H=Told(i-1,j)+Told(i+1,j);
V=Told(i,j-1)+Told(i,j+1);
T(i,j)=Tprev(i,j)*term1+term2*H+term3*V;
end
end
strt_err=max(max(abs(Told-T)));
Told=T;
jcobi_iter=jcobi_iter+1;
end
Tprev=T;
end
figure(1)
contourf(xx,yy,T,'ShowText','on');
colormap(jet)
colorbar
xlabel('X-Axis')
ylabel('Y-Axis')
colorbar
title_txt=sprintf('Solution for 2D Heat conduction Equation in transient state with number of iterations %d',jcobi_iter);
title(title_txt)
fprintf('No of iterations in Jacobi %d',jcobi_iter);
end
Function code for SOR(transient)
function T=Trns_sor(strt_err,err_tol,xx,yy,nx,ny,T,k1,k2,Told,Tprev,omega)
sor_iter=1;
for k=1:120000
while(strt_err>err_tol)
for i=2:nx-1
for j=2:ny-1
term1=(1+(2*k1)+(2*k2))^(-1);
term2=k1*term1;
term3=k2*term1;
H=Told(i-1,j)+Told(i+1,j);
V=Told(i,j-1)+Told(i,j+1);
T(i,j)=omega*(Tprev(i,j)*term1+term2*H+term3*V)+(1-omega)*Tprev(i,j);
end
end
strt_err=max(max(abs(Told-T)));
Told=T;
sor_iter=sor_iter+1;
end
Tprev=T;
end
figure(3)
contourf(xx,yy,T,'ShowText','on');
colormap(jet)
colorbar
xlabel('X-Axis')
ylabel('Y-Axis')
colorbar
title_txt=sprintf('SOR iteration number %d in transient state',sor_iter);
title(title_txt)
fprintf('No of iterations in SOR %d',sor_iter);
end
Function code for Gauss-Seidal(transient)
function T=Trns_gs(strt_err,err_tol,xx,yy,nx,ny,T,k1,k2,Told,Tprev)
gs_iter=1;
for k=1:12000
while(strt_err>err_tol)
for i=2:nx-1
for j=2:ny-1
term1=(1+(2*k1)+(2*k2))^(-1);
term2=k1*term1;
term3=k2*term1;
H=T(i-1,j)+Told(i+1,j);
V=T(i,j-1)+Told(i,j+1);
T(i,j)=Tprev(i,j)*term1+term2*H+term3*V;
end
end
strt_err=max(max(abs(Told-T)));
Told=T;
gs_iter=gs_iter+1;
end
Tprev=T;
end
figure(2)
contourf(xx,yy,T,'ShowText','on');
colormap(jet)
colorbar
xlabel('X-Axis')
ylabel('Y-Axis')
colorbar
title_txt=sprintf('Gaussian iteration number %d in transient state',gs_iter);
title(title_txt)
fprintf('No of iterations in Gaussian %d',gs_iter);
end
Sample Output for Steady state
1.SOR

2.Gauss

3.Jacobi

Conclusion
- Steady State method yields results very quickly with the fastest being SOR method
- In transient case the time and no of iterations required is more