subroutine sgefa (a, lda, n, ipvt, info) !***BEGIN PROLOGUE SGEFA !***PURPOSE Factor a matrix using Gaussian elimination. !***CATEGORY D2A1 !***TYPE SINGLE PRECISION (SGEFA-S, DGEFA-D, CGEFA-C) !***KEYWORDS GENERAL MATRIX, LINEAR ALGEBRA, LINPACK, ! MATRIX FACTORIZATION !***AUTHOR Moler, C. B., (U. of New Mexico) !***DESCRIPTION ! ! SGEFA factors a real matrix by Gaussian elimination. ! ! SGEFA is usually called by SGECO, but it can be called ! directly with a saving in time if RCOND is not needed. ! (Time for SGECO) = (1 + 9/N)*(Time for SGEFA) . ! ! On Entry ! ! a real(lda, n) ! the matrix to be factored. ! ! lda integer ! the leading dimension of the array a . ! ! n integer ! the order of the matrix a . ! ! On Return ! ! a an upper triangular matrix and the multipliers ! which were used to obtain it. ! the factorization can be written a = l*u , where ! l is a product of permutation and unit lower ! triangular matrices and u is upper triangular. ! ! ipvt integer(n) ! an integer vector of pivot indices. ! ! info integer ! = 0 normal value. ! = k if u(k,k) .eq. 0.0 . this is not an error ! condition for this subroutine, but it does ! indicate that sgesl or sgedi will divide by zero ! if called. use rcond in sgeco for a reliable ! indication of singularity. ! !***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W. ! Stewart, LINPACK Users' Guide, SIAM, 1979. !***ROUTINES CALLED ISAMAX, SAXPY, SSCAL !***REVISION HISTORY (YYMMDD) ! 780814 DATE WRITTEN ! 890831 Modified array declarations. (WRB) ! 890831 REVISION DATE from Version 3.2 ! 891214 Prologue converted to Version 4.0 format. (BAB) ! 900326 Removed duplicate information from DESCRIPTION section. ! (WRB) ! 920501 Reformatted the REFERENCES section. (WRB) !***END PROLOGUE SGEFA integer lda,n,ipvt(*),info real a(lda,*) ! real t integer isamax,j,k,kp1,l,nm1 ! ! gaussian elimination with partial pivoting ! !***first executable statement sgefa info = 0 nm1 = n - 1 if (nm1 .lt. 1) go to 70 do 60 k = 1, nm1 kp1 = k + 1 ! ! find l = pivot index ! l = isamax(n-k+1,a(k,k),1) + k - 1 ipvt(k) = l ! ! zero pivot implies this column already triangularized ! if (a(l,k) .eq. 0.0e0) go to 40 ! ! interchange if necessary ! if (l .eq. k) go to 10 t = a(l,k) a(l,k) = a(k,k) a(k,k) = t 10 continue ! ! compute multipliers ! t = -1.0e0/a(k,k) call sscal(n-k,t,a(k+1,k),1) ! ! row elimination with column indexing ! do 30 j = kp1, n t = a(l,j) if (l .eq. k) go to 20 a(l,j) = a(k,j) a(k,j) = t 20 continue call saxpy(n-k,t,a(k+1,k),1,a(k+1,j),1) 30 continue go to 50 40 continue info = k 50 continue 60 continue 70 continue ipvt(n) = n if (a(n,n) .eq. 0.0e0) info = n return end