|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- *> \brief \b CLASWLQ
- *
- * Definition:
- * ===========
- *
- * SUBROUTINE CLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK,
- * LWORK, INFO)
- *
- * .. Scalar Arguments ..
- * INTEGER INFO, LDA, M, N, MB, NB, LDT, LWORK
- * ..
- * .. Array Arguments ..
- * COMPLEX A( LDA, * ), T( LDT, * ), WORK( * )
- * ..
- *
- *
- *> \par Purpose:
- * =============
- *>
- *> \verbatim
- *>
- *> CLASWLQ computes a blocked Tall-Skinny LQ factorization of
- *> a complex M-by-N matrix A for M <= N:
- *>
- *> A = ( L 0 ) * Q,
- *>
- *> where:
- *>
- *> Q is a n-by-N orthogonal matrix, stored on exit in an implicit
- *> form in the elements above the digonal of the array A and in
- *> the elemenst of the array T;
- *> L is an lower-triangular M-by-M matrix stored on exit in
- *> the elements on and below the diagonal of the array A.
- *> 0 is a M-by-(N-M) zero matrix, if M < N, and is not stored.
- *>
- *> \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] MB
- *> \verbatim
- *> MB is INTEGER
- *> The row block size to be used in the blocked QR.
- *> M >= MB >= 1
- *> \endverbatim
- *> \param[in] NB
- *> \verbatim
- *> NB is INTEGER
- *> The column block size to be used in the blocked QR.
- *> NB > M.
- *> \endverbatim
- *>
- *> \param[in,out] A
- *> \verbatim
- *> A is COMPLEX array, dimension (LDA,N)
- *> On entry, the M-by-N matrix A.
- *> On exit, the elements on and below the diagonal
- *> of the array contain the N-by-N lower triangular matrix L;
- *> the elements above the diagonal represent Q by the rows
- *> of blocked V (see Further Details).
- *>
- *> \endverbatim
- *>
- *> \param[in] LDA
- *> \verbatim
- *> LDA is INTEGER
- *> The leading dimension of the array A. LDA >= max(1,M).
- *> \endverbatim
- *>
- *> \param[out] T
- *> \verbatim
- *> T is COMPLEX array,
- *> dimension (LDT, N * Number_of_row_blocks)
- *> where Number_of_row_blocks = CEIL((N-M)/(NB-M))
- *> The blocked upper triangular block reflectors stored in compact form
- *> as a sequence of upper triangular blocks.
- *> See Further Details below.
- *> \endverbatim
- *>
- *> \param[in] LDT
- *> \verbatim
- *> LDT is INTEGER
- *> The leading dimension of the array T. LDT >= MB.
- *> \endverbatim
- *>
- *>
- *> \param[out] WORK
- *> \verbatim
- *> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
- *>
- *> \endverbatim
- *> \param[in] LWORK
- *> \verbatim
- *> The dimension of the array WORK. LWORK >= MB*M.
- *> If LWORK = -1, then a workspace query is assumed; the routine
- *> only calculates the optimal size of the WORK array, returns
- *> this value as the first entry of the WORK array, and no error
- *> message related to LWORK is issued by XERBLA.
- *>
- *> \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.
- *
- *> \par Further Details:
- * =====================
- *>
- *> \verbatim
- *> Short-Wide LQ (SWLQ) performs LQ by a sequence of orthogonal transformations,
- *> representing Q as a product of other orthogonal matrices
- *> Q = Q(1) * Q(2) * . . . * Q(k)
- *> where each Q(i) zeros out upper diagonal entries of a block of NB rows of A:
- *> Q(1) zeros out the upper diagonal entries of rows 1:NB of A
- *> Q(2) zeros out the bottom MB-N rows of rows [1:M,NB+1:2*NB-M] of A
- *> Q(3) zeros out the bottom MB-N rows of rows [1:M,2*NB-M+1:3*NB-2*M] of A
- *> . . .
- *>
- *> Q(1) is computed by GELQT, which represents Q(1) by Householder vectors
- *> stored under the diagonal of rows 1:MB of A, and by upper triangular
- *> block reflectors, stored in array T(1:LDT,1:N).
- *> For more information see Further Details in GELQT.
- *>
- *> Q(i) for i>1 is computed by TPLQT, which represents Q(i) by Householder vectors
- *> stored in columns [(i-1)*(NB-M)+M+1:i*(NB-M)+M] of A, and by upper triangular
- *> block reflectors, stored in array T(1:LDT,(i-1)*M+1:i*M).
- *> The last Q(k) may use fewer rows.
- *> For more information see Further Details in TPQRT.
- *>
- *> For more details of the overall algorithm, see the description of
- *> Sequential TSQR in Section 2.2 of [1].
- *>
- *> [1] “Communication-Optimal Parallel and Sequential QR and LU Factorizations,”
- *> J. Demmel, L. Grigori, M. Hoemmen, J. Langou,
- *> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
- *> \endverbatim
- *>
- * =====================================================================
- SUBROUTINE CLASWLQ( M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK,
- $ INFO)
- *
- * -- LAPACK computational routine (version 3.9.0) --
- * -- LAPACK is a software package provided by Univ. of Tennessee, --
- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. --
- * June 2017
- *
- * .. Scalar Arguments ..
- INTEGER INFO, LDA, M, N, MB, NB, LWORK, LDT
- * ..
- * .. Array Arguments ..
- COMPLEX A( LDA, * ), WORK( * ), T( LDT, *)
- * ..
- *
- * =====================================================================
- *
- * ..
- * .. Local Scalars ..
- LOGICAL LQUERY
- INTEGER I, II, KK, CTR
- * ..
- * .. EXTERNAL FUNCTIONS ..
- LOGICAL LSAME
- EXTERNAL LSAME
- * .. EXTERNAL SUBROUTINES ..
- EXTERNAL CGELQT, CTPLQT, XERBLA
- * .. INTRINSIC FUNCTIONS ..
- INTRINSIC MAX, MIN, MOD
- * ..
- * .. EXTERNAL FUNCTIONS ..
- INTEGER ILAENV
- EXTERNAL ILAENV
- * ..
- * .. EXECUTABLE STATEMENTS ..
- *
- * TEST THE INPUT ARGUMENTS
- *
- INFO = 0
- *
- LQUERY = ( LWORK.EQ.-1 )
- *
- IF( M.LT.0 ) THEN
- INFO = -1
- ELSE IF( N.LT.0 .OR. N.LT.M ) THEN
- INFO = -2
- ELSE IF( MB.LT.1 .OR. ( MB.GT.M .AND. M.GT.0 )) THEN
- INFO = -3
- ELSE IF( NB.LE.M ) THEN
- INFO = -4
- ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
- INFO = -5
- ELSE IF( LDT.LT.MB ) THEN
- INFO = -8
- ELSE IF( ( LWORK.LT.M*MB) .AND. (.NOT.LQUERY) ) THEN
- INFO = -10
- END IF
- IF( INFO.EQ.0) THEN
- WORK(1) = MB*M
- END IF
- *
- IF( INFO.NE.0 ) THEN
- CALL XERBLA( 'CLASWLQ', -INFO )
- RETURN
- ELSE IF (LQUERY) THEN
- RETURN
- END IF
- *
- * Quick return if possible
- *
- IF( MIN(M,N).EQ.0 ) THEN
- RETURN
- END IF
- *
- * The LQ Decomposition
- *
- IF((M.GE.N).OR.(NB.LE.M).OR.(NB.GE.N)) THEN
- CALL CGELQT( M, N, MB, A, LDA, T, LDT, WORK, INFO)
- RETURN
- END IF
- *
- KK = MOD((N-M),(NB-M))
- II=N-KK+1
- *
- * Compute the LQ factorization of the first block A(1:M,1:NB)
- *
- CALL CGELQT( M, NB, MB, A(1,1), LDA, T, LDT, WORK, INFO)
- CTR = 1
- *
- DO I = NB+1, II-NB+M , (NB-M)
- *
- * Compute the QR factorization of the current block A(1:M,I:I+NB-M)
- *
- CALL CTPLQT( M, NB-M, 0, MB, A(1,1), LDA, A( 1, I ),
- $ LDA, T(1,CTR*M+1),
- $ LDT, WORK, INFO )
- CTR = CTR + 1
- END DO
- *
- * Compute the QR factorization of the last block A(1:M,II:N)
- *
- IF (II.LE.N) THEN
- CALL CTPLQT( M, KK, 0, MB, A(1,1), LDA, A( 1, II ),
- $ LDA, T(1,CTR*M+1), LDT,
- $ WORK, INFO )
- END IF
- *
- WORK( 1 ) = M * MB
- RETURN
- *
- * End of CLASWLQ
- *
- END
|