5

Click here to load reader

Program Untuk Menyelesaikan Distribusi Panas Pada Pelat Dengan Metode ADI

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