1       SUBROUTINE CGERQS( 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 RQ factorization
 22 *      A = R*Q
 23 *  computed by CGERQF.
 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 RQ factorization of the original matrix A as
 39 *          returned by CGERQF.
 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 right hand side vectors for the linear system.
 49 *          On exit, the solution vectors X.  Each solution vector
 50 *          is contained in rows 1:N of a column of B.
 51 *
 52 *  LDB     (input) INTEGER
 53 *          The leading dimension of the array B. LDB >= max(1,N).
 54 *
 55 *  WORK    (workspace) COMPLEX array, dimension (LWORK)
 56 *
 57 *  LWORK   (input) INTEGER
 58 *          The length of the array WORK.  LWORK must be at least NRHS,
 59 *          and should be at least NRHS*NB, where NB is the block size
 60 *          for this environment.
 61 *
 62 *  INFO    (output) INTEGER
 63 *          = 0: successful exit
 64 *          < 0: if INFO = -i, the i-th argument had an illegal value
 65 *
 66 *  =====================================================================
 67 *
 68 *     .. Parameters ..
 69       COMPLEX            CZERO, CONE
 70       PARAMETER          ( CZERO = ( 0.0E+00.0E+0 ),
 71      $                   CONE = ( 1.0E+00.0E+0 ) )
 72 *     ..
 73 *     .. External Subroutines ..
 74       EXTERNAL           CLASET, CTRSM, CUNMRQ, XERBLA
 75 *     ..
 76 *     .. Intrinsic Functions ..
 77       INTRINSIC          MAX
 78 *     ..
 79 *     .. Executable Statements ..
 80 *
 81 *     Test the input parameters.
 82 *
 83       INFO = 0
 84       IF( M.LT.0 ) THEN
 85          INFO = -1
 86       ELSE IF( N.LT.0 .OR. M.GT.N ) THEN
 87          INFO = -2
 88       ELSE IF( NRHS.LT.0 ) THEN
 89          INFO = -3
 90       ELSE IF( LDA.LT.MAX1, M ) ) THEN
 91          INFO = -5
 92       ELSE IF( LDB.LT.MAX1, N ) ) THEN
 93          INFO = -8
 94       ELSE IF( LWORK.LT.1 .OR. LWORK.LT.NRHS .AND. M.GT.0 .AND. N.GT.0 )
 95      $          THEN
 96          INFO = -10
 97       END IF
 98       IF( INFO.NE.0 ) THEN
 99          CALL XERBLA( 'CGERQS'-INFO )
100          RETURN
101       END IF
102 *
103 *     Quick return if possible
104 *
105       IF( N.EQ.0 .OR. NRHS.EQ.0 .OR. M.EQ.0 )
106      $   RETURN
107 *
108 *     Solve R*X = B(n-m+1:n,:)
109 *
110       CALL CTRSM( 'Left''Upper''No transpose''Non-unit', M, NRHS,
111      $            CONE, A( 1, N-M+1 ), LDA, B( N-M+11 ), LDB )
112 *
113 *     Set B(1:n-m,:) to zero
114 *
115       CALL CLASET( 'Full', N-M, NRHS, CZERO, CZERO, B, LDB )
116 *
117 *     B := Q' * B
118 *
119       CALL CUNMRQ( 'Left''Conjugate transpose', N, NRHS, M, A, LDA,
120      $             TAU, B, LDB, WORK, LWORK, INFO )
121 *
122       RETURN
123 *
124 *     End of CGERQS
125 *
126       END