Line Jacobi (Fortran Version)


      program ljacobi
      parameter(mmax=50,nmax=50,mx=mmax+1,ny=nmax+1)
      parameter(tol=.005)
      dimension u(0:mx,0:ny)
      dimension v(0:mx,0:ny)
      dimension e(0:mx,0:ny)
      dimension a(nmax), b(nmax), c(nmax), d(nmax)
c*********************************************
c
c    Line Jacobi algorithm for
c    Laplace difference equation with
c    Dirichlet boundary conditions
c
c**********************************************
c    Initialize  arrays and set boundary conditions
c**********************************************
      dx = 1./mx
      do 2 m = 1,mmax
      x = m*dx
      v(m,0) = x*x 
      v(m,ny) = x*x - 1.
2     continue
      dy = 1./ny
      do 3 n = 1,nmax
      y = n*dy
      v(0,n) = -y*y
      v(mx,n) = 1. - y*y
3     continue
      do 99 j = 1,nmax
      do 99 i = 1,mmax
      x = i*dx
      y = j*dy
      e(i,j) = x*x - y*y
      v(i,j) = 0.0
99    continue
 
c********************************************
c   start Line Jacobi iterations
c********************************************
      do 77 k = 1,100
 
c**********************************************
c     Perform 10 Line Jacobi iterations and check error
c**********************************************
c  step across the m columns      
      do 6 m  = 1,mmax
c  build tridiagonal system for column m
      do 55 n = 1,nmax
      a(n) = -1.
      b(n) = 4.
      c(n) = -1.
      d(n) = v(m-1,n) + v(m+1,n)
55    continue
      d(1) = d(1) + v(m,0)
      d(nmax) = d(nmax) + v(m,ny)
c   start forward substitution
      do 10 i = 2,nmax
      ratio = a(i)/b(i-1)
      b(i) = b(i) - ratio*c(i-1)
      d(i) = d(i) - ratio*d(i-1)
10    continue
c   initialize backward substitution
      d(nmax) = d(nmax)/b(nmax)
      u(m,nmax) = d(nmax)
c   finish bacward substitution
      do 20 i = nmax-1,1,-1
      d(i) = (d(i) - c(i)*d(i+1))/b(i)
      u(m,i) = d(i)
20    continue
6     continue
 
c   write u back into v to prepare for next iteration
      do 7 n = 1,nmax
      do 7 m = 1,mmax
      v(m,n) = u(m,n) 
7     continue
 
 
c   output residual and error information
      residual = 0.0
      emax = 0.0
      do 88 n = 1,mmax
      do 88 m = 1,mmax
      res = 4.*v(m,n) - (v(m-1,n)+v(m,n-1)+v(m+1,n)+v(m,n+1))
      residual = amax1(abs(res),residual)
      error = v(m,n) - e(m,n)
      emax = amax1(abs(error),emax)
88    continue
      write(6,200) k,residual,emax
      if(emax.lt.tol) goto 999
 
77    continue
999   write(6,300)
 
200   format('at iteration ',i5' residual = ',e10.2' error = ',e10.2)
 
300   format('done')
      end