| @@ -1,194 +0,0 @@ | |||
| *> \brief \b DGELQS | |||
| * | |||
| * =========== DOCUMENTATION =========== | |||
| * | |||
| * Online html documentation available at | |||
| * http://www.netlib.org/lapack/explore-html/ | |||
| * | |||
| * Definition: | |||
| * =========== | |||
| * | |||
| * SUBROUTINE DGELQS( M, N, NRHS, A, LDA, TAU, B, LDB, WORK, LWORK, | |||
| * INFO ) | |||
| * | |||
| * .. Scalar Arguments .. | |||
| * INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS | |||
| * .. | |||
| * .. Array Arguments .. | |||
| * DOUBLE PRECISION A( LDA, * ), B( LDB, * ), TAU( * ), | |||
| * $ WORK( LWORK ) | |||
| * .. | |||
| * | |||
| * | |||
| *> \par Purpose: | |||
| * ============= | |||
| *> | |||
| *> \verbatim | |||
| *> | |||
| *> Compute a minimum-norm solution | |||
| *> min || A*X - B || | |||
| *> using the LQ factorization | |||
| *> A = L*Q | |||
| *> computed by DGELQF. | |||
| *> \endverbatim | |||
| * | |||
| * Arguments: | |||
| * ========== | |||
| * | |||
| *> \param[in] M | |||
| *> \verbatim | |||
| *> M is INTEGER | |||
| *> The number of rows of the matrix A. M >= 0. | |||
| *> \endverbatim | |||
| *> | |||
| *> \param[in] N | |||
| *> \verbatim | |||
| *> N is INTEGER | |||
| *> The number of columns of the matrix A. N >= M >= 0. | |||
| *> \endverbatim | |||
| *> | |||
| *> \param[in] NRHS | |||
| *> \verbatim | |||
| *> NRHS is INTEGER | |||
| *> The number of columns of B. NRHS >= 0. | |||
| *> \endverbatim | |||
| *> | |||
| *> \param[in] A | |||
| *> \verbatim | |||
| *> A is DOUBLE PRECISION array, dimension (LDA,N) | |||
| *> Details of the LQ factorization of the original matrix A as | |||
| *> returned by DGELQF. | |||
| *> \endverbatim | |||
| *> | |||
| *> \param[in] LDA | |||
| *> \verbatim | |||
| *> LDA is INTEGER | |||
| *> The leading dimension of the array A. LDA >= M. | |||
| *> \endverbatim | |||
| *> | |||
| *> \param[in] TAU | |||
| *> \verbatim | |||
| *> TAU is DOUBLE PRECISION array, dimension (M) | |||
| *> Details of the orthogonal matrix Q. | |||
| *> \endverbatim | |||
| *> | |||
| *> \param[in,out] B | |||
| *> \verbatim | |||
| *> B is DOUBLE PRECISION array, dimension (LDB,NRHS) | |||
| *> On entry, the m-by-nrhs right hand side matrix B. | |||
| *> On exit, the n-by-nrhs solution matrix X. | |||
| *> \endverbatim | |||
| *> | |||
| *> \param[in] LDB | |||
| *> \verbatim | |||
| *> LDB is INTEGER | |||
| *> The leading dimension of the array B. LDB >= N. | |||
| *> \endverbatim | |||
| *> | |||
| *> \param[out] WORK | |||
| *> \verbatim | |||
| *> WORK is DOUBLE PRECISION array, dimension (LWORK) | |||
| *> \endverbatim | |||
| *> | |||
| *> \param[in] LWORK | |||
| *> \verbatim | |||
| *> LWORK is INTEGER | |||
| *> The length of the array WORK. LWORK must be at least NRHS, | |||
| *> and should be at least NRHS*NB, where NB is the block size | |||
| *> for this environment. | |||
| *> \endverbatim | |||
| *> | |||
| *> \param[out] INFO | |||
| *> \verbatim | |||
| *> INFO is INTEGER | |||
| *> = 0: successful exit | |||
| *> < 0: if INFO = -i, the i-th argument had an illegal value | |||
| *> \endverbatim | |||
| * | |||
| * Authors: | |||
| * ======== | |||
| * | |||
| *> \author Univ. of Tennessee | |||
| *> \author Univ. of California Berkeley | |||
| *> \author Univ. of Colorado Denver | |||
| *> \author NAG Ltd. | |||
| * | |||
| *> \ingroup double_lin | |||
| * | |||
| * ===================================================================== | |||
| SUBROUTINE DGELQS( M, N, NRHS, A, LDA, TAU, B, LDB, WORK, LWORK, | |||
| $ INFO ) | |||
| * | |||
| * -- LAPACK test routine -- | |||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||
| * | |||
| * .. Scalar Arguments .. | |||
| INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS | |||
| * .. | |||
| * .. Array Arguments .. | |||
| DOUBLE PRECISION A( LDA, * ), B( LDB, * ), TAU( * ), | |||
| $ WORK( LWORK ) | |||
| * .. | |||
| * | |||
| * ===================================================================== | |||
| * | |||
| * .. Parameters .. | |||
| DOUBLE PRECISION ZERO, ONE | |||
| PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) | |||
| * .. | |||
| * .. External Subroutines .. | |||
| EXTERNAL DLASET, DORMLQ, DTRSM, XERBLA | |||
| * .. | |||
| * .. Intrinsic Functions .. | |||
| INTRINSIC MAX | |||
| * .. | |||
| * .. Executable Statements .. | |||
| * | |||
| * Test the input parameters. | |||
| * | |||
| INFO = 0 | |||
| IF( M.LT.0 ) THEN | |||
| INFO = -1 | |||
| ELSE IF( N.LT.0 .OR. M.GT.N ) THEN | |||
| INFO = -2 | |||
| ELSE IF( NRHS.LT.0 ) THEN | |||
| INFO = -3 | |||
| ELSE IF( LDA.LT.MAX( 1, M ) ) THEN | |||
| INFO = -5 | |||
| ELSE IF( LDB.LT.MAX( 1, N ) ) THEN | |||
| INFO = -8 | |||
| ELSE IF( LWORK.LT.1 .OR. LWORK.LT.NRHS .AND. M.GT.0 .AND. N.GT.0 ) | |||
| $ THEN | |||
| INFO = -10 | |||
| END IF | |||
| IF( INFO.NE.0 ) THEN | |||
| CALL XERBLA( 'DGELQS', -INFO ) | |||
| RETURN | |||
| END IF | |||
| * | |||
| * Quick return if possible | |||
| * | |||
| IF( N.EQ.0 .OR. NRHS.EQ.0 .OR. M.EQ.0 ) | |||
| $ RETURN | |||
| * | |||
| * Solve L*X = B(1:m,:) | |||
| * | |||
| CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Non-unit', M, NRHS, | |||
| $ ONE, A, LDA, B, LDB ) | |||
| * | |||
| * Set B(m+1:n,:) to zero | |||
| * | |||
| IF( M.LT.N ) | |||
| $ CALL DLASET( 'Full', N-M, NRHS, ZERO, ZERO, B( M+1, 1 ), LDB ) | |||
| * | |||
| * B := Q' * B | |||
| * | |||
| CALL DORMLQ( 'Left', 'Transpose', N, NRHS, M, A, LDA, TAU, B, LDB, | |||
| $ WORK, LWORK, INFO ) | |||
| * | |||
| RETURN | |||
| * | |||
| * End of DGELQS | |||
| * | |||
| END | |||