123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- *> \brief \b ZLARFT
- *
- * =========== DOCUMENTATION ===========
- *
- * Online html documentation available at
- * http://www.netlib.org/lapack/explore-html/
- *
- *> \htmlonly
- *> Download ZLARFT + dependencies
- *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarft.f">
- *> [TGZ]</a>
- *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarft.f">
- *> [ZIP]</a>
- *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarft.f">
- *> [TXT]</a>
- *> \endhtmlonly
- *
- * Definition:
- * ===========
- *
- * SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
- *
- * .. Scalar Arguments ..
- * CHARACTER DIRECT, STOREV
- * INTEGER K, LDT, LDV, N
- * ..
- * .. Array Arguments ..
- * COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * )
- * ..
- *
- *
- *> \par Purpose:
- * =============
- *>
- *> \verbatim
- *>
- *> ZLARFT forms the triangular factor T of a complex block reflector H
- *> of order n, which is defined as a product of k elementary reflectors.
- *>
- *> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;
- *>
- *> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.
- *>
- *> If STOREV = 'C', the vector which defines the elementary reflector
- *> H(i) is stored in the i-th column of the array V, and
- *>
- *> H = I - V * T * V**H
- *>
- *> If STOREV = 'R', the vector which defines the elementary reflector
- *> H(i) is stored in the i-th row of the array V, and
- *>
- *> H = I - V**H * T * V
- *> \endverbatim
- *
- * Arguments:
- * ==========
- *
- *> \param[in] DIRECT
- *> \verbatim
- *> DIRECT is CHARACTER*1
- *> Specifies the order in which the elementary reflectors are
- *> multiplied to form the block reflector:
- *> = 'F': H = H(1) H(2) . . . H(k) (Forward)
- *> = 'B': H = H(k) . . . H(2) H(1) (Backward)
- *> \endverbatim
- *>
- *> \param[in] STOREV
- *> \verbatim
- *> STOREV is CHARACTER*1
- *> Specifies how the vectors which define the elementary
- *> reflectors are stored (see also Further Details):
- *> = 'C': columnwise
- *> = 'R': rowwise
- *> \endverbatim
- *>
- *> \param[in] N
- *> \verbatim
- *> N is INTEGER
- *> The order of the block reflector H. N >= 0.
- *> \endverbatim
- *>
- *> \param[in] K
- *> \verbatim
- *> K is INTEGER
- *> The order of the triangular factor T (= the number of
- *> elementary reflectors). K >= 1.
- *> \endverbatim
- *>
- *> \param[in] V
- *> \verbatim
- *> V is COMPLEX*16 array, dimension
- *> (LDV,K) if STOREV = 'C'
- *> (LDV,N) if STOREV = 'R'
- *> The matrix V. See further details.
- *> \endverbatim
- *>
- *> \param[in] LDV
- *> \verbatim
- *> LDV is INTEGER
- *> The leading dimension of the array V.
- *> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.
- *> \endverbatim
- *>
- *> \param[in] TAU
- *> \verbatim
- *> TAU is COMPLEX*16 array, dimension (K)
- *> TAU(i) must contain the scalar factor of the elementary
- *> reflector H(i).
- *> \endverbatim
- *>
- *> \param[out] T
- *> \verbatim
- *> T is COMPLEX*16 array, dimension (LDT,K)
- *> The k by k triangular factor T of the block reflector.
- *> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is
- *> lower triangular. The rest of the array is not used.
- *> \endverbatim
- *>
- *> \param[in] LDT
- *> \verbatim
- *> LDT is INTEGER
- *> The leading dimension of the array T. LDT >= K.
- *> \endverbatim
- *
- * Authors:
- * ========
- *
- *> \author Univ. of Tennessee
- *> \author Univ. of California Berkeley
- *> \author Univ. of Colorado Denver
- *> \author NAG Ltd.
- *
- *> \date April 2012
- *
- *> \ingroup complex16OTHERauxiliary
- *
- *> \par Further Details:
- * =====================
- *>
- *> \verbatim
- *>
- *> The shape of the matrix V and the storage of the vectors which define
- *> the H(i) is best illustrated by the following example with n = 5 and
- *> k = 3. The elements equal to 1 are not stored.
- *>
- *> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R':
- *>
- *> V = ( 1 ) V = ( 1 v1 v1 v1 v1 )
- *> ( v1 1 ) ( 1 v2 v2 v2 )
- *> ( v1 v2 1 ) ( 1 v3 v3 )
- *> ( v1 v2 v3 )
- *> ( v1 v2 v3 )
- *>
- *> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R':
- *>
- *> V = ( v1 v2 v3 ) V = ( v1 v1 1 )
- *> ( v1 v2 v3 ) ( v2 v2 v2 1 )
- *> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 )
- *> ( 1 v3 )
- *> ( 1 )
- *> \endverbatim
- *>
- * =====================================================================
- SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
- *
- * -- LAPACK auxiliary routine (version 3.4.1) --
- * -- LAPACK is a software package provided by Univ. of Tennessee, --
- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
- * April 2012
- *
- * .. Scalar Arguments ..
- CHARACTER DIRECT, STOREV
- INTEGER K, LDT, LDV, N
- * ..
- * .. Array Arguments ..
- COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * )
- * ..
- *
- * =====================================================================
- *
- * .. Parameters ..
- COMPLEX*16 ONE, ZERO
- PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ),
- $ ZERO = ( 0.0D+0, 0.0D+0 ) )
- * ..
- * .. Local Scalars ..
- INTEGER I, J, PREVLASTV, LASTV
- * ..
- * .. External Subroutines ..
- EXTERNAL ZGEMV, ZLACGV, ZTRMV
- * ..
- * .. External Functions ..
- LOGICAL LSAME
- EXTERNAL LSAME
- * ..
- * .. Executable Statements ..
- *
- * Quick return if possible
- *
- IF( N.EQ.0 )
- $ RETURN
- *
- IF( LSAME( DIRECT, 'F' ) ) THEN
- PREVLASTV = N
- DO I = 1, K
- PREVLASTV = MAX( PREVLASTV, I )
- IF( TAU( I ).EQ.ZERO ) THEN
- *
- * H(i) = I
- *
- DO J = 1, I
- T( J, I ) = ZERO
- END DO
- ELSE
- *
- * general case
- *
- IF( LSAME( STOREV, 'C' ) ) THEN
- * Skip any trailing zeros.
- DO LASTV = N, I+1, -1
- IF( V( LASTV, I ).NE.ZERO ) EXIT
- END DO
- DO J = 1, I-1
- T( J, I ) = -TAU( I ) * CONJG( V( I , J ) )
- END DO
- J = MIN( LASTV, PREVLASTV )
- *
- * T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i)
- *
- CALL ZGEMV( 'Conjugate transpose', J-I, I-1,
- $ -TAU( I ), V( I+1, 1 ), LDV,
- $ V( I+1, I ), 1, ONE, T( 1, I ), 1 )
- ELSE
- * Skip any trailing zeros.
- DO LASTV = N, I+1, -1
- IF( V( I, LASTV ).NE.ZERO ) EXIT
- END DO
- DO J = 1, I-1
- T( J, I ) = -TAU( I ) * V( J , I )
- END DO
- J = MIN( LASTV, PREVLASTV )
- *
- * T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H
- *
- CALL ZGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ),
- $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV,
- $ ONE, T( 1, I ), LDT )
- END IF
- *
- * T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i)
- *
- CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T,
- $ LDT, T( 1, I ), 1 )
- T( I, I ) = TAU( I )
- IF( I.GT.1 ) THEN
- PREVLASTV = MAX( PREVLASTV, LASTV )
- ELSE
- PREVLASTV = LASTV
- END IF
- END IF
- END DO
- ELSE
- PREVLASTV = 1
- DO I = K, 1, -1
- IF( TAU( I ).EQ.ZERO ) THEN
- *
- * H(i) = I
- *
- DO J = I, K
- T( J, I ) = ZERO
- END DO
- ELSE
- *
- * general case
- *
- IF( I.LT.K ) THEN
- IF( LSAME( STOREV, 'C' ) ) THEN
- * Skip any leading zeros.
- DO LASTV = 1, I-1
- IF( V( LASTV, I ).NE.ZERO ) EXIT
- END DO
- DO J = I+1, K
- T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) )
- END DO
- J = MAX( LASTV, PREVLASTV )
- *
- * T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i)
- *
- CALL ZGEMV( 'Conjugate transpose', N-K+I-J, K-I,
- $ -TAU( I ), V( J, I+1 ), LDV, V( J, I ),
- $ 1, ONE, T( I+1, I ), 1 )
- ELSE
- * Skip any leading zeros.
- DO LASTV = 1, I-1
- IF( V( I, LASTV ).NE.ZERO ) EXIT
- END DO
- DO J = I+1, K
- T( J, I ) = -TAU( I ) * V( J, N-K+I )
- END DO
- J = MAX( LASTV, PREVLASTV )
- *
- * T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H
- *
- CALL ZGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ),
- $ V( I+1, J ), LDV, V( I, J ), LDV,
- $ ONE, T( I+1, I ), LDT )
- END IF
- *
- * T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i)
- *
- CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I,
- $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 )
- IF( I.GT.1 ) THEN
- PREVLASTV = MIN( PREVLASTV, LASTV )
- ELSE
- PREVLASTV = LASTV
- END IF
- END IF
- T( I, I ) = TAU( I )
- END IF
- END DO
- END IF
- RETURN
- *
- * End of ZLARFT
- *
- END
|