Click here to load reader
Upload
rizki-amalia-tri-cahyani
View
8
Download
3
Embed Size (px)
DESCRIPTION
Fortran
Citation preview
! Program untuk menyelesaikan Distribusi Panas pada Pelat dengan Metode ADI
parameter (N=20)
real u0(N,N),un(N,N),a(N),b(N),c(N),d(N)
&,dx,dy,rxy,ryx,Lx,Ly
common/variabel/u0,un,NX,NY
! Inputs
Lx = 1.
Ly = 1.
dx = 0.1
dy = 0.1
A = 10
sigx = 100.
sigy = 100.
NX = int(Lx/dx) + 1
NY = int(Ly/dy) + 1
rxy= (dx/dy)**2
ryx= (dy/dx)**2
! Newman Boundary Condition
do j=1,NY
un(1,j)= un(j-dx,i)
un(NX,j)= 0
enddo
do i=1,NX
un(i,1)= un(i-dx,j)
un(i,NY)= 0
enddo
! Matrix Coefficients along j
do i=1,NX
a(i)=1.
b(i)=-4. !(b(i)=-4 for dx=dy; others b(i)=-2)
c(i)=1.
enddo
! Matrix Coefficients along i
do j=1,NY
a(j)=1.
b(j)=-4. !(b(j)=-4 for dx=dy; others b(j)=-2)
c(j)=1.
enddo
iter= 0
100 call error (err_sum)
call update
iter= iter +1
write(*,*)iter
! Distribusi Panas Sepanjang j
! Solution along line j
u(0.5*Lx,0.5*Ly)= A*exp(-(((x-Lx/2)**2)/(2*sigx**2))+
& A*exp(-(((y-Ly/2)**2)/(2*sigy**2))
do j=2,NY-1
do i=1,NX
b(i)=-4. !(b(i)=-4 for dx=dy; others b(i)=-2)
enddo
do i=2,NX-1
u0(0.5*Ly,j-1)= un(0.5*Lx,j-1)
enddo
! RHS Matrix Values
do i=3,NX-2
d(i)= -(u0(0.5*Ly,j-1)+u0(0.5*Ly,j+1)) ! for dx=dy
! d(i)= -rxy*(u0(0.5*Ly,j-1)-2.*u0(0.5*Ly,j)+u0(0.5*Ly,j+1)) ! for dx not equal to dy
enddo
d(2)= -(u0(2,j-1)+u0(2,j+1))-a(1)*u0(1,j) ! for dx=dy
d(NX-1)= -(u0(NX-1,j-1)+u0(NX-1,j+1))-a(NX)*u0(NX,j) ! for dx=dy
! d(2)= -rxy*(u0(2,j-1)-2.*u0(2,j)+u0(2,j+1))-a(1)*u0(1,j)
! d(NX-1)= -rxy*(u0(NX-1,j-1)-2.*u0(NX-1,j)+u0(NX-1,j+1))
! & -a(NX)*u0(NX,j)
call tridiag (2,NX-1,a,b,c,d)
do i=2,NX-1
un(i,j)= d(i)
enddo
enddo
! Distribusi Panas Sepanjang i
! Solution along line i
call error (err_sum)
call update
iter= iter +1
write(*,*)iter
u(0.5*Lx,0.5*Ly)= A*exp(-(((x-Lx/2)**2)/(2*sigx**2))+
& A*exp(-(((y-Ly/2)**2)/(2*sigy**2))
do i=2,NX-1
do j=2,NY-1
u0(i-1,Ly/2)= un(i-1,Ly/2)
enddo
! Koef. Matrix
do j=1,NY
b(j)=-4. !(b(i)=-4 for dx=dy; others b(i)=-2)
enddo
! RHS Matrix Values
do j=3,NY-2
d(j)= -(u0(i-1,Ly/2)+u0(i+1,Ly/2)) ! for dx = dy
! d(j)= -ryx*(u0(i-1,Ly/2)-2.*u0(i,Ly/2)+u0(i+1,Ly/2)) ! for dx not eq. to dy
enddo
d(2) = -(u0(i-1,2)+u0(i+1,2))-a(1)*u0(i,1) !for dx = dy
d(NY-1)= -(u0(i-1,NY-1)+u0(i+1,NY-1))-a(NY)*u0(i,NY) !for dx = dy
! d(2) = -ryx*(u0(i-1,2)-2.*u0(i,2)+u0(i+1,2))-a(1)*u0(i,1)
! d(NY-1)= -ryx*(u0(i-1,NY-1)-2.*u0(i,NY-1)+u0(i+1,NY-1))
! & -a(NY)*u0(i,NY)
call tridiag (2,NY-1,a,b,c,d)
do j=2,NY-1
un(Lx/2,Ly/2)= d(j)
enddo
enddo
if(err_sum.gt.1.e-4.and.iter.le.50) goto 100
! Writing Final Results
open(5,file='output_adi.dat')
do j=ny,1,-1
write(5,'(100f12.2)')(un(Lx/2,Ly/2),i=1,nx)
enddo
close(5)
stop
end
! LISTING OF SUBROUTINES
subroutine tridiag(IL,IU,aa,bb,cc,dd)
real aa(1),bb(1),cc(1),dd(1)
! Establish Upper Triangular Matrix
LP= IL+1
do k= LP,IU
xm=aa(k)/bb(k-1)
bb(k)=bb(k)-xm*cc(k-1)
dd(k)=dd(k)-xm*dd(k-1)
enddo
! Back substitution
dd(IU)=dd(IU)/bb(IU)
do k=IU-1,IL,-1
dd(k)=(dd(k)-cc(k)*dd(k+1))/bb(k)
enddo
return
end
subroutine update
parameter(N=20)
real u0(N,N),Un(N,N)
common/variabel/u0,un,NX,NY
do i=1,NX
do j=1,NY
u0(Lx/2,Ly/2)=un(Lx/2,Ly/2)
enddo
enddo
return
end
subroutine error (err_sum)
parameter (N=20)
real u0(N,N),un(N,N),ue(N,N)
common/variabel/u0,un,NX,NY
do i=1,NX ; do j=1,NY
ue(Lx/2,Ly/2)= un(Lx/2,Ly/2)
enddo ; enddo
sum = 0.0
err_sum= 0.0
do i=1,NX ; do j=1,NY
sum = sum + abs(u0(Lx/2,Ly/2))
err_sum= err_sum+abs(u0(Lx/2,Ly/2)-ue(Lx/2,Ly/2))
enddo ; enddo
err_sum= err_sum/sum
return
end