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