version 1.9, 2011/11/21 20:43:17
|
version 1.14, 2012/12/14 14:22:52
|
Line 1
|
Line 1
|
*> \brief \b ZLARFT |
*> \brief \b ZLARFT forms the triangular factor T of a block reflector H = I - vtvH |
* |
* |
* =========== DOCUMENTATION =========== |
* =========== DOCUMENTATION =========== |
* |
* |
Line 86
|
Line 86
|
*> elementary reflectors). K >= 1. |
*> elementary reflectors). K >= 1. |
*> \endverbatim |
*> \endverbatim |
*> |
*> |
*> \param[in,out] V |
*> \param[in] V |
*> \verbatim |
*> \verbatim |
*> V is COMPLEX*16 array, dimension |
*> V is COMPLEX*16 array, dimension |
*> (LDV,K) if STOREV = 'C' |
*> (LDV,K) if STOREV = 'C' |
Line 130
|
Line 130
|
*> \author Univ. of Colorado Denver |
*> \author Univ. of Colorado Denver |
*> \author NAG Ltd. |
*> \author NAG Ltd. |
* |
* |
*> \date November 2011 |
*> \date September 2012 |
* |
* |
*> \ingroup complex16OTHERauxiliary |
*> \ingroup complex16OTHERauxiliary |
* |
* |
Line 141
|
Line 141
|
*> |
*> |
*> The shape of the matrix V and the storage of the vectors which define |
*> 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 |
*> the H(i) is best illustrated by the following example with n = 5 and |
*> k = 3. The elements equal to 1 are not stored; the corresponding |
*> k = 3. The elements equal to 1 are not stored. |
*> array elements are modified but restored on exit. The rest of the |
|
*> array is not used. |
|
*> |
*> |
*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': |
*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': |
*> |
*> |
Line 165
|
Line 163
|
* ===================================================================== |
* ===================================================================== |
SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) |
SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) |
* |
* |
* -- LAPACK auxiliary routine (version 3.4.0) -- |
* -- LAPACK auxiliary routine (version 3.4.2) -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* November 2011 |
* September 2012 |
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
CHARACTER DIRECT, STOREV |
CHARACTER DIRECT, STOREV |
Line 187
|
Line 185
|
* .. |
* .. |
* .. Local Scalars .. |
* .. Local Scalars .. |
INTEGER I, J, PREVLASTV, LASTV |
INTEGER I, J, PREVLASTV, LASTV |
COMPLEX*16 VII |
|
* .. |
* .. |
* .. External Subroutines .. |
* .. External Subroutines .. |
EXTERNAL ZGEMV, ZLACGV, ZTRMV |
EXTERNAL ZGEMV, ZLACGV, ZTRMV |
Line 205
|
Line 202
|
* |
* |
IF( LSAME( DIRECT, 'F' ) ) THEN |
IF( LSAME( DIRECT, 'F' ) ) THEN |
PREVLASTV = N |
PREVLASTV = N |
DO 20 I = 1, K |
DO I = 1, K |
PREVLASTV = MAX( PREVLASTV, I ) |
PREVLASTV = MAX( PREVLASTV, I ) |
IF( TAU( I ).EQ.ZERO ) THEN |
IF( TAU( I ).EQ.ZERO ) THEN |
* |
* |
* H(i) = I |
* H(i) = I |
* |
* |
DO 10 J = 1, I |
DO J = 1, I |
T( J, I ) = ZERO |
T( J, I ) = ZERO |
10 CONTINUE |
END DO |
ELSE |
ELSE |
* |
* |
* general case |
* general case |
* |
* |
VII = V( I, I ) |
|
V( I, I ) = ONE |
|
IF( LSAME( STOREV, 'C' ) ) THEN |
IF( LSAME( STOREV, 'C' ) ) THEN |
! Skip any trailing zeros. |
* Skip any trailing zeros. |
DO LASTV = N, I+1, -1 |
DO LASTV = N, I+1, -1 |
IF( V( LASTV, I ).NE.ZERO ) EXIT |
IF( V( LASTV, I ).NE.ZERO ) EXIT |
END DO |
END DO |
|
DO J = 1, I-1 |
|
T( J, I ) = -TAU( I ) * CONJG( V( I , J ) ) |
|
END DO |
J = MIN( LASTV, PREVLASTV ) |
J = MIN( LASTV, PREVLASTV ) |
* |
* |
* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) |
* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) |
* |
* |
CALL ZGEMV( 'Conjugate transpose', J-I+1, I-1, |
CALL ZGEMV( 'Conjugate transpose', J-I, I-1, |
$ -TAU( I ), V( I, 1 ), LDV, V( I, I ), 1, |
$ -TAU( I ), V( I+1, 1 ), LDV, |
$ ZERO, T( 1, I ), 1 ) |
$ V( I+1, I ), 1, ONE, T( 1, I ), 1 ) |
ELSE |
ELSE |
! Skip any trailing zeros. |
* Skip any trailing zeros. |
DO LASTV = N, I+1, -1 |
DO LASTV = N, I+1, -1 |
IF( V( I, LASTV ).NE.ZERO ) EXIT |
IF( V( I, LASTV ).NE.ZERO ) EXIT |
END DO |
END DO |
|
DO J = 1, I-1 |
|
T( J, I ) = -TAU( I ) * V( J , I ) |
|
END DO |
J = MIN( LASTV, PREVLASTV ) |
J = MIN( LASTV, PREVLASTV ) |
* |
* |
* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H |
* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H |
* |
* |
IF( I.LT.J ) |
CALL ZGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ), |
$ CALL ZLACGV( J-I, V( I, I+1 ), LDV ) |
$ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, |
CALL ZGEMV( 'No transpose', I-1, J-I+1, -TAU( I ), |
$ ONE, T( 1, I ), LDT ) |
$ V( 1, I ), LDV, V( I, I ), LDV, ZERO, |
|
$ T( 1, I ), 1 ) |
|
IF( I.LT.J ) |
|
$ CALL ZLACGV( J-I, V( I, I+1 ), LDV ) |
|
END IF |
END IF |
V( I, I ) = VII |
|
* |
* |
* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) |
* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) |
* |
* |
Line 262
|
Line 258
|
PREVLASTV = LASTV |
PREVLASTV = LASTV |
END IF |
END IF |
END IF |
END IF |
20 CONTINUE |
END DO |
ELSE |
ELSE |
PREVLASTV = 1 |
PREVLASTV = 1 |
DO 40 I = K, 1, -1 |
DO I = K, 1, -1 |
IF( TAU( I ).EQ.ZERO ) THEN |
IF( TAU( I ).EQ.ZERO ) THEN |
* |
* |
* H(i) = I |
* H(i) = I |
* |
* |
DO 30 J = I, K |
DO J = I, K |
T( J, I ) = ZERO |
T( J, I ) = ZERO |
30 CONTINUE |
END DO |
ELSE |
ELSE |
* |
* |
* general case |
* general case |
* |
* |
IF( I.LT.K ) THEN |
IF( I.LT.K ) THEN |
IF( LSAME( STOREV, 'C' ) ) THEN |
IF( LSAME( STOREV, 'C' ) ) THEN |
VII = V( N-K+I, I ) |
* Skip any leading zeros. |
V( N-K+I, I ) = ONE |
|
! Skip any leading zeros. |
|
DO LASTV = 1, I-1 |
DO LASTV = 1, I-1 |
IF( V( LASTV, I ).NE.ZERO ) EXIT |
IF( V( LASTV, I ).NE.ZERO ) EXIT |
END DO |
END DO |
|
DO J = I+1, K |
|
T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) ) |
|
END DO |
J = MAX( LASTV, PREVLASTV ) |
J = MAX( LASTV, PREVLASTV ) |
* |
* |
* T(i+1:k,i) := |
* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,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+1, K-I, |
CALL ZGEMV( 'Conjugate transpose', N-K+I-J, K-I, |
$ -TAU( I ), V( J, I+1 ), LDV, V( J, I ), |
$ -TAU( I ), V( J, I+1 ), LDV, V( J, I ), |
$ 1, ZERO, T( I+1, I ), 1 ) |
$ 1, ONE, T( I+1, I ), 1 ) |
V( N-K+I, I ) = VII |
|
ELSE |
ELSE |
VII = V( I, N-K+I ) |
* Skip any leading zeros. |
V( I, N-K+I ) = ONE |
|
! Skip any leading zeros. |
|
DO LASTV = 1, I-1 |
DO LASTV = 1, I-1 |
IF( V( I, LASTV ).NE.ZERO ) EXIT |
IF( V( I, LASTV ).NE.ZERO ) EXIT |
END DO |
END DO |
|
DO J = I+1, K |
|
T( J, I ) = -TAU( I ) * V( J, N-K+I ) |
|
END DO |
J = MAX( LASTV, PREVLASTV ) |
J = MAX( LASTV, PREVLASTV ) |
* |
* |
* T(i+1:k,i) := |
* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H |
* - tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H |
|
* |
* |
CALL ZLACGV( N-K+I-1-J+1, V( I, J ), LDV ) |
CALL ZGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ), |
CALL ZGEMV( 'No transpose', K-I, N-K+I-J+1, |
$ V( I+1, J ), LDV, V( I, J ), LDV, |
$ -TAU( I ), V( I+1, J ), LDV, V( I, J ), LDV, |
$ ONE, T( I+1, I ), LDT ) |
$ ZERO, T( I+1, I ), 1 ) |
|
CALL ZLACGV( N-K+I-1-J+1, V( I, J ), LDV ) |
|
V( I, N-K+I ) = VII |
|
END IF |
END IF |
* |
* |
* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) |
* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) |
Line 326
|
Line 318
|
END IF |
END IF |
T( I, I ) = TAU( I ) |
T( I, I ) = TAU( I ) |
END IF |
END IF |
40 CONTINUE |
END DO |
END IF |
END IF |
RETURN |
RETURN |
* |
* |