PROGRAM SOLVE
REAL A(2500), B(50), X(50)
INTEGER I, J, N, IERR, IPIV(50)
PRINT *, 'INPUT N'
READ *, N
DO 10 I=1,N
PRINT *, 'INPUT COEF FOR ROW ', I
READ *, (A(N*(J-1)+I), J=1,N)
PRINT *, 'INPUT B(', I, ')'
READ *, B(I)
10 CONTINUE
PRINT *, 'THE SOLUTION TO:'
DO 20 I=1,N
PRINT *, (A(N*J-N+I), J=1,N), ' |',
B(I)
20 CONTINUE
CALL GAUSS(A, N, B, X, IPIV, IERR)
PRINT *, 'IS:'
IF (IERR .NE. 0) THEN
PRINT *, 'NO SOLUTION'
ELSE
PRINT *, (X(I), I=1,N)
ENDIF
END
SUBROUTINE GAUSS(A, N, B, X, IPIV, IERR)
INTEGER N, I, J, K, L, IPIV(1)
REAL A(N,1), B(1), X(1), AA
IERR = 0
C INITIALIZE
PIVOT ARRAY
DO 10 I=1,N
10 IPIV(I) = I
C FORWARD
ELIMINATION
DO 50 I=1,N-1
DO 50, J=I+1, N
IF (A(IPIV(I),I) .EQ. 0.0) THEN
DO 20 K=I+1, N
IF (A(IPIV(K),I) .NE. 0.0) THEN
L = IPIV(K)
IPIV(K) = IPIV(I)
IPIV(I) = L
GOTO 30
ENDIF
20 CONTINUE
IERR = -1
RETURN
ENDIF
30 AA = A(IPIV(J),I) / A(IPIV(I),I)
DO 40 K=I+1, N
A(IPIV(J),K) = A(IPIV(J),K) - AA *
A(IPIV(I),K)
40 CONTINUE
B(IPIV(J)) = B(IPIV(J)) - AA *
B(IPIV(I))
50 CONTINUE
C BACK
SUBSTITUTION
IF (A(IPIV(N),N) .EQ. 0.0) THEN
IERR = -1
RETURN
ENDIF
X(N) = B(IPIV(N)) / A(IPIV(N),N)
DO 70 I=N-1, 1, -1
DO 60 J=I+1, N
B(IPIV(I)) = B(IPIV(I)) -
A(IPIV(I),J) * X(J)
60 CONTINUE
X(I) = B(IPIV(I)) / A(IPIV(I),I)
70 CONTINUE
END