Gauss-Jordan Elimination
MODULE GJE
CONTAINS
SUBROUTINE simul(a, b, ndim, n, error)
IMPLICIT NONE
INTEGER, INTENT(IN) :: ndim
REAL, INTENT(INOUT), DIMENSION(ndim, ndim) :: a
REAL, INTENT(INOUT), DIMENSION(ndim) :: b
INTEGER, INTENT(IN) :: n
INTEGER, INTENT(OUT) :: error
REAL, PARAMETER :: EPSILON = 1.0E-6
REAL :: factor
INTEGER :: irow
INTEGER :: ipeak
INTEGER :: jrow
INTEGER :: kcol
REAL :: TEMP
INTEGER :: i, j
DO irow = 1, n
ipeak = irow
! 하삼각 행렬 중 해당 열에서 최대값 찾기
DO jrow = irow + 1,n
IF (ABS(a(jrow, irow)) > ABS(a(ipeak, irow))) THEN
ipeak = jrow
END IF
END DO
IF (ABS(a(ipeak, irow)) < EPSILON) THEN
error = 1
RETURN
END IF
! 최대값 행과 현재 행 바꾸기
IF (ipeak /= irow) THEN
DO kcol = 1, n
temp = a(ipeak, kcol)
a(ipeak, kcol) = a(irow, kcol)
a(irow, kcol) = temp
END DO
temp = b(ipeak)
b(ipeak) = b(irow)
b(irow) = temp
END IF
WRITE (*,*) "Coefficients after swapping rows :"
DO i = 1, n
WRITE (*,"(1X,7F11.4)") (a(i,j), j = 1, n), b(i)
END DO
! 현재 행을 제외하고 열을 0로 만들기
DO jrow = 1, n
IF (jrow /= irow) THEN
factor = -a(jrow, irow)/a(irow,irow)
DO kcol = 1, n
a(jrow, kcol) = a(irow, kcol) * factor + a(jrow, kcol)
END DO
b(jrow) = b(irow) * factor + b(jrow)
END IF
END DO
WRITE (*,*) "Coefficients after sweepping :"
DO i = 1, n
WRITE (*,"(1X,7F11.4)") (a(i,j), j = 1, n), b(i)
END DO
END DO
! 대각원소를 1로 만들기
DO irow = 1, n
b(irow) = b(irow) / a(irow, irow)
a(irow, irow) = 1.
END DO
error = 0
END SUBROUTINE simul
END MODULE GJE
위 소스를 gje.f95로 저장
PROGRAM test_simul
USE gje
IMPLICIT NONE
!constants
INTEGER, PARAMETER :: MAX_SIZE = 10 ! max number of equations
!local variables
REAL, DIMENSION(MAX_SIZE, MAX_SIZE) :: a ! left hand side
REAL, DIMENSION(MAX_SIZE) :: b ! right hand side
INTEGER :: error
CHARACTER(LEN = 20) :: file_name
INTEGER :: i, j ! loop index
INTEGER :: n ! number of simul equations
INTEGER :: istat ! I/O status
! get the file name
WRITE (*,*) "Enter the file name containing the equations:"
READ (*,'(A20)') file_name
! open file
OPEN (UNIT = 11, FILE = file_name, STATUS = 'OLD', ACTION = 'READ', IOSTAT = istat)
! was the OPEN successful?
IF (istat == 0) THEN
READ (11, *) n
IF (n <= MAX_SIZE) THEN
DO i = 1, n
READ (11, *) (a(i, j), j=1, n), b(i)
END DO
WRITE (*,*) "Coefficients before call:"
DO i = 1, n
WRITE (*, '(1X, 7F11.4)') (a(i, j), j = 1, n), b(i)
END DO
CALL simul(a, b, MAX_SIZE, n, error)
IF (error /= 0) THEN
WRITE (*, 1010)
1010 FORMAT (/1X, 'Zero pivot encountered!', &
//1X, 'There is no unique solution to this system.')
ELSE
WRITE (*,*) "Coefficients after call :"
DO i = 1, n
WRITE (*,"(1X,7F11.4)") (a(i,j), j = 1, n), b(i)
END DO
WRITE(*,*) "The Solutions are :"
DO i = 1, n
WRITE (*,"(3X,'X(', I2,') = ', F16.6)") i, b(i)
END DO
END IF
ELSE
WRITE (*,*) "The number of equatons is less than or equal to ", MAX_SIZE
END IF
ELSE
WRITE (*, 1020) istat
1020 FORMAT (1X, 'File open failed -- status = ', I6)
END IF
END PROGRAM test_simul
위 소스를 test_simul.f95로 저장
3
1. 1. 1. 1.
2. 1. 1. 2.
1. 3. 2. 4.
위 데이터를 inputs1.txt로 저장
컴파일 및 테스트
'Programming > Fortran' 카테고리의 다른 글
Intrinsic Character Functions (0) | 2008.12.16 |
---|---|
Lexical Functions (0) | 2008.12.16 |
Assumed-Shape Dummy Arrays (0) | 2008.12.16 |
Explicit-Shape Dummy Arrays (0) | 2008.12.15 |
FORALL (0) | 2008.12.15 |