Advertisement
Guest User

Untitled

a guest
Jan 6th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. PROGRAM ca5
  2.     IMPLICIT NONE
  3.     INTEGER :: i, j, k, n
  4.     REAL :: a(5,5), b(5,1), l(5,5), u(5,5), x(5,1), y(5,1)
  5.  
  6.     !declaration
  7.     n = 5
  8.     a = RESHAPE( (/ 14.0, 14.0, -9.0, 3.0, 5.0, &
  9.           & 14.0, 52.0, -15.0, 2.0, -32.0, &
  10.           & -9.0, -15.0, 36.0, -5.0, 16.0, &
  11.           & 3.0, 2.0, -5.0, 47.0, 49.0, &
  12.           & -5.0, -32.0, 16.0, 49.0, 79.0 /), (/ 5, 5 /) )
  13.     b = RESHAPE( (/ -15.0, -100.0, 106.0, 329.0, 463.0 /), (/ 5, 1 /) )
  14.     DO i = 1, n
  15.         DO j = 1, n
  16.             l(i,j) = 0
  17.             u(i,j) = 0
  18.             x(i,j) = 0
  19.             y(i,j) = 0
  20.         ENDDO
  21.         l(i,i) = 1
  22.     ENDDO
  23.    
  24.     !LU, alternately solve row for upper and column for lower
  25.     DO i = 1, n
  26.         DO j = i, n
  27.             u(i,j) = a(i,j)
  28.             DO k = 1, i - 1
  29.                 u(i,j) = u(i,j) - u(k,j) * l(i,k)
  30.             ENDDO
  31.         ENDDO
  32.  
  33.         DO j = i + 1, n    
  34.             l(j,i) = a(j,i)
  35.             DO k = 1, i - 1
  36.                 l(j,i) = l(j,i) - l(j,k) * u(k,i)
  37.             ENDDO
  38.             l(j,i) = l(j,i) / u(i,i)
  39.         ENDDO
  40.     ENDDO
  41.    
  42.     !find y
  43.     DO i = 1, n
  44.         y(i,1) = b(i,1)
  45.         DO j = 1, i - 1
  46.             y(i,1) = y(i,1) - l(i,j) * y(j,1)
  47.         ENDDO
  48.     ENDDO
  49.    
  50.     !find x
  51.     DO i = 0, n - 1
  52.         x(n-i,1) = y(n-i,1)
  53.         DO j = 1, i
  54.             x(n-i,1) = x(n-i,1) - u(n-i,n-j+1) * x(n-j+1,1)
  55.         ENDDO
  56.         x(n-i,1) = x(n-i,1) / u(n-i,n-i)
  57.     ENDDO
  58.    
  59.     CALL print_mat('A',a)
  60.     CALL print_mat('B',b)
  61.     CALL print_mat('L',l)
  62.     CALL print_mat('U',u)
  63.     CALL print_mat('y',y)
  64.     CALL print_mat('x',x, .TRUE.)
  65. CONTAINS
  66.     SUBROUTINE print_mat(name, mat, rounding)
  67.         CHARACTER(1) :: name
  68.         REAL, INTENT(IN) :: mat(:,:)
  69.         LOGICAL, OPTIONAL :: rounding
  70.        
  71.         DO i = 1, 85
  72.             WRITE(*, '(A)', ADVANCE = "NO") '+'
  73.         ENDDO
  74.         WRITE(*,*) name
  75.         DO i = 1, n
  76.             DO j = 1, INT(SIZE(mat)/n)
  77.                 WRITE(*,"(F10.5)", ADVANCE = "NO") mat(i,j)
  78.                 IF(PRESENT(rounding).AND.(rounding)) THEN
  79.                     WRITE(*,*) "=~", NINT(mat(i,j))
  80.                 ENDIF
  81.             ENDDO
  82.             WRITE(*,*) ""
  83.         ENDDO
  84.     ENDSUBROUTINE
  85. ENDPROGRAM ca5
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement