1       SUBROUTINE ZGEQRS( M, N, NRHS, A, LDA, TAU, B, LDB, WORK, LWORK,
  2      $                   INFO )
  3 *
  4 *  -- LAPACK routine (version 3.1) --
  5 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
  6 *     November 2006
  7 *
  8 *     .. Scalar Arguments ..
  9       INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS
 10 *     ..
 11 *     .. Array Arguments ..
 12       COMPLEX*16         A( LDA, * ), B( LDB, * ), TAU( * ),
 13      $                   WORK( LWORK )
 14 *     ..
 15 *
 16 *  Purpose
 17 *  =======
 18 *
 19 *  Solve the least squares problem
 20 *      min || A*X - B ||
 21 *  using the QR factorization
 22 *      A = Q*R
 23 *  computed by ZGEQRF.
 24 *
 25 *  Arguments
 26 *  =========
 27 *
 28 *  M       (input) INTEGER
 29 *          The number of rows of the matrix A.  M >= 0.
 30 *
 31 *  N       (input) INTEGER
 32 *          The number of columns of the matrix A.  M >= N >= 0.
 33 *
 34 *  NRHS    (input) INTEGER
 35 *          The number of columns of B.  NRHS >= 0.
 36 *
 37 *  A       (input) COMPLEX*16 array, dimension (LDA,N)
 38 *          Details of the QR factorization of the original matrix A as
 39 *          returned by ZGEQRF.
 40 *
 41 *  LDA     (input) INTEGER
 42 *          The leading dimension of the array A.  LDA >= M.
 43 *
 44 *  TAU     (input) COMPLEX*16 array, dimension (N)
 45 *          Details of the orthogonal matrix Q.
 46 *
 47 *  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
 48 *          On entry, the m-by-nrhs right hand side matrix B.
 49 *          On exit, the n-by-nrhs solution matrix X.
 50 *
 51 *  LDB     (input) INTEGER
 52 *          The leading dimension of the array B. LDB >= M.
 53 *
 54 *  WORK    (workspace) COMPLEX*16 array, dimension (LWORK)
 55 *
 56 *  LWORK   (input) INTEGER
 57 *          The length of the array WORK.  LWORK must be at least NRHS,
 58 *          and should be at least NRHS*NB, where NB is the block size
 59 *          for this environment.
 60 *
 61 *  INFO    (output) INTEGER
 62 *          = 0: successful exit
 63 *          < 0: if INFO = -i, the i-th argument had an illegal value
 64 *
 65 *  =====================================================================
 66 *
 67 *     .. Parameters ..
 68       COMPLEX*16         ONE
 69       PARAMETER          ( ONE = ( 1.0D+00.0D+0 ) )
 70 *     ..
 71 *     .. External Subroutines ..
 72       EXTERNAL           XERBLA, ZTRSM, ZUNMQR
 73 *     ..
 74 *     .. Intrinsic Functions ..
 75       INTRINSIC          MAX
 76 *     ..
 77 *     .. Executable Statements ..
 78 *
 79 *     Test the input arguments.
 80 *
 81       INFO = 0
 82       IF( M.LT.0 ) THEN
 83          INFO = -1
 84       ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
 85          INFO = -2
 86       ELSE IF( NRHS.LT.0 ) THEN
 87          INFO = -3
 88       ELSE IF( LDA.LT.MAX1, M ) ) THEN
 89          INFO = -5
 90       ELSE IF( LDB.LT.MAX1, M ) ) THEN
 91          INFO = -8
 92       ELSE IF( LWORK.LT.1 .OR. LWORK.LT.NRHS .AND. M.GT.0 .AND. N.GT.0 )
 93      $          THEN
 94          INFO = -10
 95       END IF
 96       IF( INFO.NE.0 ) THEN
 97          CALL XERBLA( 'ZGEQRS'-INFO )
 98          RETURN
 99       END IF
100 *
101 *     Quick return if possible
102 *
103       IF( N.EQ.0 .OR. NRHS.EQ.0 .OR. M.EQ.0 )
104      $   RETURN
105 *
106 *     B := Q' * B
107 *
108       CALL ZUNMQR( 'Left''Conjugate transpose', M, NRHS, N, A, LDA,
109      $             TAU, B, LDB, WORK, LWORK, INFO )
110 *
111 *     Solve R*X = B(1:n,:)
112 *
113       CALL ZTRSM( 'Left''Upper''No transpose''Non-unit', N, NRHS,
114      $            ONE, A, LDA, B, LDB )
115 *
116       RETURN
117 *
118 *     End of ZGEQRS
119 *
120       END