1       SUBROUTINE ZGEQL2( M, N, A, LDA, TAU, WORK, INFO )
  2 *
  3 *  -- LAPACK routine (version 3.3.1) --
  4 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  5 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  6 *  -- April 2011                                                      --
  7 *
  8 *     .. Scalar Arguments ..
  9       INTEGER            INFO, LDA, M, N
 10 *     ..
 11 *     .. Array Arguments ..
 12       COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
 13 *     ..
 14 *
 15 *  Purpose
 16 *  =======
 17 *
 18 *  ZGEQL2 computes a QL factorization of a complex m by n matrix A:
 19 *  A = Q * L.
 20 *
 21 *  Arguments
 22 *  =========
 23 *
 24 *  M       (input) INTEGER
 25 *          The number of rows of the matrix A.  M >= 0.
 26 *
 27 *  N       (input) INTEGER
 28 *          The number of columns of the matrix A.  N >= 0.
 29 *
 30 *  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
 31 *          On entry, the m by n matrix A.
 32 *          On exit, if m >= n, the lower triangle of the subarray
 33 *          A(m-n+1:m,1:n) contains the n by n lower triangular matrix L;
 34 *          if m <= n, the elements on and below the (n-m)-th
 35 *          superdiagonal contain the m by n lower trapezoidal matrix L;
 36 *          the remaining elements, with the array TAU, represent the
 37 *          unitary matrix Q as a product of elementary reflectors
 38 *          (see Further Details).
 39 *
 40 *  LDA     (input) INTEGER
 41 *          The leading dimension of the array A.  LDA >= max(1,M).
 42 *
 43 *  TAU     (output) COMPLEX*16 array, dimension (min(M,N))
 44 *          The scalar factors of the elementary reflectors (see Further
 45 *          Details).
 46 *
 47 *  WORK    (workspace) COMPLEX*16 array, dimension (N)
 48 *
 49 *  INFO    (output) INTEGER
 50 *          = 0: successful exit
 51 *          < 0: if INFO = -i, the i-th argument had an illegal value
 52 *
 53 *  Further Details
 54 *  ===============
 55 *
 56 *  The matrix Q is represented as a product of elementary reflectors
 57 *
 58 *     Q = H(k) . . . H(2) H(1), where k = min(m,n).
 59 *
 60 *  Each H(i) has the form
 61 *
 62 *     H(i) = I - tau * v * v**H
 63 *
 64 *  where tau is a complex scalar, and v is a complex vector with
 65 *  v(m-k+i+1:m) = 0 and v(m-k+i) = 1; v(1:m-k+i-1) is stored on exit in
 66 *  A(1:m-k+i-1,n-k+i), and tau in TAU(i).
 67 *
 68 *  =====================================================================
 69 *
 70 *     .. Parameters ..
 71       COMPLEX*16         ONE
 72       PARAMETER          ( ONE = ( 1.0D+00.0D+0 ) )
 73 *     ..
 74 *     .. Local Scalars ..
 75       INTEGER            I, K
 76       COMPLEX*16         ALPHA
 77 *     ..
 78 *     .. External Subroutines ..
 79       EXTERNAL           XERBLA, ZLARF, ZLARFG
 80 *     ..
 81 *     .. Intrinsic Functions ..
 82       INTRINSIC          DCONJGMAXMIN
 83 *     ..
 84 *     .. Executable Statements ..
 85 *
 86 *     Test the input arguments
 87 *
 88       INFO = 0
 89       IF( M.LT.0 ) THEN
 90          INFO = -1
 91       ELSE IF( N.LT.0 ) THEN
 92          INFO = -2
 93       ELSE IF( LDA.LT.MAX1, M ) ) THEN
 94          INFO = -4
 95       END IF
 96       IF( INFO.NE.0 ) THEN
 97          CALL XERBLA( 'ZGEQL2'-INFO )
 98          RETURN
 99       END IF
100 *
101       K = MIN( M, N )
102 *
103       DO 10 I = K, 1-1
104 *
105 *        Generate elementary reflector H(i) to annihilate
106 *        A(1:m-k+i-1,n-k+i)
107 *
108          ALPHA = A( M-K+I, N-K+I )
109          CALL ZLARFG( M-K+I, ALPHA, A( 1, N-K+I ), 1, TAU( I ) )
110 *
111 *        Apply H(i)**H to A(1:m-k+i,1:n-k+i-1) from the left
112 *
113          A( M-K+I, N-K+I ) = ONE
114          CALL ZLARF( 'Left', M-K+I, N-K+I-1, A( 1, N-K+I ), 1,
115      $               DCONJG( TAU( I ) ), A, LDA, WORK )
116          A( M-K+I, N-K+I ) = ALPHA
117    10 CONTINUE
118       RETURN
119 *
120 *     End of ZGEQL2
121 *
122       END