next up previous contents
Next: Solution Up: Alignment using Templates Previous: Solution

 

Run Gaussian Elimination 2D

The code (which is available by clicking here) given below performs Elimination. Add HPF directives for execution on a 2D processor array.

Between the indicated points, give a line by line commentary on what communications will be performed? (In other words, explain what communications are implied by each line given the distribution directives that you have supplied.)

      PROGRAM GAUSS_90
      REAL, allocatable ::  A(:,:), X(:), Y(:), START(:)
      INTEGER :: i
      character*10 time

      REAL TEMP
      REAL, allocatable :: SWAP(:)

      INTEGER j, n, location, location_array(1)

      print *, "Problem size = ? (>5)"
      read (*,*) n
      print *, "Problem size = ", n
      call date_and_time(time=time)
      print *, time, "     ---- time to start the job"
      allocate(a(n,n), x(n), y(n), start(n), swap(n))
      A = 0.1
      DO i=1,n
        START(i) = i
        A(1+MODULO(i+1,n),i) = i+5
      ENDDO
      Y = 0
      DO i = 1, n
        Y(i) = SUM( A(i,:)*START )
      ENDDO

      call date_and_time(time=time)
      print *, time, "     ---- problem has been set up"

      !CALL GAUSS_ELIM_90( A, X, Y )

       DO i = 1, n-1

! Between here >>
!-------------------------------------------------+
         location_array = MAXLOC( ABS(A(i:n,i)) ) !
         location = location_array(1)+i-1         !
         SWAP(i:n) = A(location,i:n)              !
         TEMP = Y(location)                       !
         IF (location /= i) THEN                  !
           A(location,i:n) = A(i,i:n)             !
           A(i,i:n) = SWAP(i:n)                   !
           Y(location) = Y(i)                     !
           Y(i) = TEMP                            !
         END IF                                   !
!-------------------------------------------------+
! << and here

         DO j = i+1, n
            A(j,i) = A(j, i) / swap(i)
            A(j, i+1:n) = A(j, i+1:n ) - a(j, i) * SWAP(i+1:n)
            Y(j) = Y(j) - a(j,i) * TEMP
         ENDDO
       ENDDO

       call date_and_time(time=time)
       print *, time, "     ---- forward finished "

       X(n) = Y(n) / A(n,n)
       DO i = n-1, 1, -1
         Y(1:i) = Y(1:i) - X(i+1) * A(1:i, i+1)
         X(i) = Y(i) / A(i,i)
       ENDDO

      call date_and_time(time=time)
      print *, time, "     ---- problem has been solved"

      DO i = 1, 5
        WRITE(*,*) i, X(i)
      ENDDO

      DO i = n - 4, n
        WRITE(*,*) i, X(i)
      ENDDO

      END PROGRAM GAUSS_90

Go back to Notes gif




next up previous contents
Next: Solution Up: Alignment using Templates Previous: Solution

©University of Liverpool, 1997
Thu May 29 10:11:26 BST 1997
Not for commercial use.