1 SUBROUTINE CGEFA(A,LDA,N,IPVT,INFO) 2C***BEGIN PROLOGUE CGEFA 3C***DATE WRITTEN 780814 (YYMMDD) 4C***REVISION DATE 820801 (YYMMDD) 5C***REVISION HISTORY (YYMMDD) 6C 000330 Modified array declarations. (JEC) 7C***CATEGORY NO. D2C1 8C***KEYWORDS COMPLEX,FACTOR,LINEAR ALGEBRA,LINPACK,MATRIX 9C***AUTHOR MOLER, C. B., (U. OF NEW MEXICO) 10C***PURPOSE Factors a COMPLEX matrix by Gaussian elimination. 11C***DESCRIPTION 12C 13C CGEFA factors a complex matrix by Gaussian elimination. 14C 15C CGEFA is usually called by CGECO, but it can be called 16C directly with a saving in time if RCOND is not needed. 17C (Time for CGECO) = (1 + 9/N)*(Time for CGEFA) . 18C 19C On Entry 20C 21C A COMPLEX(LDA, N) 22C the matrix to be factored. 23C 24C LDA INTEGER 25C the leading dimension of the array A . 26C 27C N INTEGER 28C the order of the matrix A . 29C 30C On Return 31C 32C A an upper triangular matrix and the multipliers 33C which were used to obtain it. 34C The factorization can be written A = L*U where 35C L is a product of permutation and unit lower 36C triangular matrices and U is upper triangular. 37C 38C IPVT INTEGER(N) 39C an integer vector of pivot indices. 40C 41C INFO INTEGER 42C = 0 normal value. 43C = K if U(K,K) .EQ. 0.0 . This is not an error 44C condition for this subroutine, but it does 45C indicate that CGESL or CGEDI will divide by zero 46C if called. Use RCOND in CGECO for a reliable 47C indication of singularity. 48C 49C LINPACK. This version dated 08/14/78 . 50C Cleve Moler, University of New Mexico, Argonne National Lab. 51C 52C Subroutines and Functions 53C 54C BLAS CAXPY,CSCAL,ICAMAX 55C Fortran ABS,AIMAG,REAL 56C***REFERENCES DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W., 57C *LINPACK USERS GUIDE*, SIAM, 1979. 58C***ROUTINES CALLED CAXPY,CSCAL,ICAMAX 59C***END PROLOGUE CGEFA 60 INTEGER LDA,N,IPVT(*),INFO 61 COMPLEX A(LDA,*) 62C 63 COMPLEX T 64 INTEGER ICAMAX,J,K,KP1,L,NM1 65 COMPLEX ZDUM 66 REAL CABS1 67 CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM)) 68C 69C GAUSSIAN ELIMINATION WITH PARTIAL PIVOTING 70C 71C***FIRST EXECUTABLE STATEMENT CGEFA 72 INFO = 0 73 NM1 = N - 1 74 IF (NM1 .LT. 1) GO TO 70 75 DO 60 K = 1, NM1 76 KP1 = K + 1 77C 78C FIND L = PIVOT INDEX 79C 80 L = ICAMAX(N-K+1,A(K,K),1) + K - 1 81 IPVT(K) = L 82C 83C ZERO PIVOT IMPLIES THIS COLUMN ALREADY TRIANGULARIZED 84C 85 IF (CABS1(A(L,K)) .EQ. 0.0E0) GO TO 40 86C 87C INTERCHANGE IF NECESSARY 88C 89 IF (L .EQ. K) GO TO 10 90 T = A(L,K) 91 A(L,K) = A(K,K) 92 A(K,K) = T 93 10 CONTINUE 94C 95C COMPUTE MULTIPLIERS 96C 97 T = -(1.0E0,0.0E0)/A(K,K) 98 CALL CSCAL(N-K,T,A(K+1,K),1) 99C 100C ROW ELIMINATION WITH COLUMN INDEXING 101C 102 DO 30 J = KP1, N 103 T = A(L,J) 104 IF (L .EQ. K) GO TO 20 105 A(L,J) = A(K,J) 106 A(K,J) = T 107 20 CONTINUE 108 CALL CAXPY(N-K,T,A(K+1,K),1,A(K+1,J),1) 109 30 CONTINUE 110 GO TO 50 111 40 CONTINUE 112 INFO = K 113 50 CONTINUE 114 60 CONTINUE 115 70 CONTINUE 116 IPVT(N) = N 117 IF (CABS1(A(N,N)) .EQ. 0.0E0) INFO = N 118 RETURN 119 END 120