|
|
1.1 ! root 1: subroutine sgefa(a,lda,n,ipvt,info) ! 2: integer lda,n,ipvt(1),info ! 3: real a(lda,1) ! 4: c ! 5: c sgefa factors a real matrix by gaussian elimination. ! 6: c ! 7: c sgefa is usually called by sgeco, but it can be called ! 8: c directly with a saving in time if rcond is not needed. ! 9: c (time for sgeco) = (1 + 9/n)*(time for sgefa) . ! 10: c ! 11: c on entry ! 12: c ! 13: c a real(lda, n) ! 14: c the matrix to be factored. ! 15: c ! 16: c lda integer ! 17: c the leading dimension of the array a . ! 18: c ! 19: c n integer ! 20: c the order of the matrix a . ! 21: c ! 22: c on return ! 23: c ! 24: c a an upper triangular matrix and the multipliers ! 25: c which were used to obtain it. ! 26: c the factorization can be written a = l*u where ! 27: c l is a product of permutation and unit lower ! 28: c triangular matrices and u is upper triangular. ! 29: c ! 30: c ipvt integer(n) ! 31: c an integer vector of pivot indices. ! 32: c ! 33: c info integer ! 34: c = 0 normal value. ! 35: c = k if u(k,k) .eq. 0.0 . this is not an error ! 36: c condition for this subroutine, but it does ! 37: c indicate that sgesl or sgedi will divide by zero ! 38: c if called. use rcond in sgeco for a reliable ! 39: c indication of singularity. ! 40: c ! 41: c linpack. this version dated 08/14/78 . ! 42: c cleve moler, university of new mexico, argonne national lab. ! 43: c ! 44: c subroutines and functions ! 45: c ! 46: c blas saxpy,sscal,isamax ! 47: c ! 48: c internal variables ! 49: c ! 50: real t ! 51: integer isamax,j,k,kp1,l,nm1 ! 52: c ! 53: c ! 54: c gaussian elimination with partial pivoting ! 55: c ! 56: info = 0 ! 57: nm1 = n - 1 ! 58: if (nm1 .lt. 1) go to 70 ! 59: do 60 k = 1, nm1 ! 60: kp1 = k + 1 ! 61: c ! 62: c find l = pivot index ! 63: c ! 64: l = isamax(n-k+1,a(k,k),1) + k - 1 ! 65: ipvt(k) = l ! 66: c ! 67: c zero pivot implies this column already triangularized ! 68: c ! 69: if (a(l,k) .eq. 0.0e0) go to 40 ! 70: c ! 71: c interchange if necessary ! 72: c ! 73: if (l .eq. k) go to 10 ! 74: t = a(l,k) ! 75: a(l,k) = a(k,k) ! 76: a(k,k) = t ! 77: 10 continue ! 78: c ! 79: c compute multipliers ! 80: c ! 81: t = -1.0e0/a(k,k) ! 82: call sscal(n-k,t,a(k+1,k),1) ! 83: c ! 84: c row elimination with column indexing ! 85: c ! 86: do 30 j = kp1, n ! 87: t = a(l,j) ! 88: if (l .eq. k) go to 20 ! 89: a(l,j) = a(k,j) ! 90: a(k,j) = t ! 91: 20 continue ! 92: call saxpy(n-k,t,a(k+1,k),1,a(k+1,j),1) ! 93: 30 continue ! 94: go to 50 ! 95: 40 continue ! 96: info = k ! 97: 50 continue ! 98: 60 continue ! 99: 70 continue ! 100: ipvt(n) = n ! 101: if (a(n,n) .eq. 0.0e0) info = n ! 102: return ! 103: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.