1       SUBROUTINE CGELQS( 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            A( LDA, * ), B( LDB, * ), TAU( * ),
 13      $                   WORK( LWORK )
 14 *     ..
 15 *
 16 *  Purpose
 17 *  =======
 18 *
 19 *  Compute a minimum-norm solution
 20 *      min || A*X - B ||
 21 *  using the LQ factorization
 22 *      A = L*Q
 23 *  computed by CGELQF.
 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.  N >= M >= 0.
 33 *
 34 *  NRHS    (input) INTEGER
 35 *          The number of columns of B.  NRHS >= 0.
 36 *
 37 *  A       (input) COMPLEX array, dimension (LDA,N)
 38 *          Details of the LQ factorization of the original matrix A as
 39 *          returned by CGELQF.
 40 *
 41 *  LDA     (input) INTEGER
 42 *          The leading dimension of the array A.  LDA >= M.
 43 *
 44 *  TAU     (input) COMPLEX array, dimension (M)
 45 *          Details of the orthogonal matrix Q.
 46 *
 47 *  B       (input/output) COMPLEX 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 >= N.
 53 *
 54 *  WORK    (workspace) COMPLEX 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            CZERO, CONE
 69       PARAMETER          ( CZERO = ( 0.0E+00.0E+0 ),
 70      $                   CONE = ( 1.0E+00.0E+0 ) )
 71 *     ..
 72 *     .. External Subroutines ..
 73       EXTERNAL           CLASET, CTRSM, CUNMLQ, XERBLA
 74 *     ..
 75 *     .. Intrinsic Functions ..
 76       INTRINSIC          MAX
 77 *     ..
 78 *     .. Executable Statements ..
 79 *
 80 *     Test the input parameters.
 81 *
 82       INFO = 0
 83       IF( M.LT.0 ) THEN
 84          INFO = -1
 85       ELSE IF( N.LT.0 .OR. M.GT.N ) THEN
 86          INFO = -2
 87       ELSE IF( NRHS.LT.0 ) THEN
 88          INFO = -3
 89       ELSE IF( LDA.LT.MAX1, M ) ) THEN
 90          INFO = -5
 91       ELSE IF( LDB.LT.MAX1, N ) ) THEN
 92          INFO = -8
 93       ELSE IF( LWORK.LT.1 .OR. LWORK.LT.NRHS .AND. M.GT.0 .AND. N.GT.0 )
 94      $          THEN
 95          INFO = -10
 96       END IF
 97       IF( INFO.NE.0 ) THEN
 98          CALL XERBLA( 'CGELQS'-INFO )
 99          RETURN
100       END IF
101 *
102 *     Quick return if possible
103 *
104       IF( N.EQ.0 .OR. NRHS.EQ.0 .OR. M.EQ.0 )
105      $   RETURN
106 *
107 *     Solve L*X = B(1:m,:)
108 *
109       CALL CTRSM( 'Left''Lower''No transpose''Non-unit', M, NRHS,
110      $            CONE, A, LDA, B, LDB )
111 *
112 *     Set B(m+1:n,:) to zero
113 *
114       IF( M.LT.N )
115      $   CALL CLASET( 'Full', N-M, NRHS, CZERO, CZERO, B( M+11 ),
116      $                LDB )
117 *
118 *     B := Q' * B
119 *
120       CALL CUNMLQ( 'Left''Conjugate transpose', N, NRHS, M, A, LDA,
121      $             TAU, B, LDB, WORK, LWORK, INFO )
122 *
123       RETURN
124 *
125 *     End of CGELQS
126 *
127       END