--- rpl/lapack/lapack/zlarft.f 2010/08/06 15:28:58 1.3
+++ rpl/lapack/lapack/zlarft.f 2012/08/22 09:48:37 1.12
@@ -1,9 +1,172 @@
+*> \brief \b ZLARFT
+*
+* =========== DOCUMENTATION ===========
+*
+* Online html documentation available at
+* http://www.netlib.org/lapack/explore-html/
+*
+*> \htmlonly
+*> Download ZLARFT + dependencies
+*>
+*> [TGZ]
+*>
+*> [ZIP]
+*>
+*> [TXT]
+*> \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.2) --
+* -- 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..--
-* November 2006
+* April 2012
*
* .. Scalar Arguments ..
CHARACTER DIRECT, STOREV
@@ -13,94 +176,6 @@
COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * )
* ..
*
-* Purpose
-* =======
-*
-* 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'
-*
-* 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' * T * V
-*
-* Arguments
-* =========
-*
-* DIRECT (input) 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)
-*
-* STOREV (input) CHARACTER*1
-* Specifies how the vectors which define the elementary
-* reflectors are stored (see also Further Details):
-* = 'C': columnwise
-* = 'R': rowwise
-*
-* N (input) INTEGER
-* The order of the block reflector H. N >= 0.
-*
-* K (input) INTEGER
-* The order of the triangular factor T (= the number of
-* elementary reflectors). K >= 1.
-*
-* V (input/output) COMPLEX*16 array, dimension
-* (LDV,K) if STOREV = 'C'
-* (LDV,N) if STOREV = 'R'
-* The matrix V. See further details.
-*
-* LDV (input) INTEGER
-* The leading dimension of the array V.
-* If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.
-*
-* TAU (input) COMPLEX*16 array, dimension (K)
-* TAU(i) must contain the scalar factor of the elementary
-* reflector H(i).
-*
-* T (output) 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.
-*
-* LDT (input) INTEGER
-* The leading dimension of the array T. LDT >= K.
-*
-* Further Details
-* ===============
-*
-* 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; the corresponding
-* 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':
-*
-* 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 )
-*
* =====================================================================
*
* .. Parameters ..
@@ -110,7 +185,6 @@
* ..
* .. Local Scalars ..
INTEGER I, J, PREVLASTV, LASTV
- COMPLEX*16 VII
* ..
* .. External Subroutines ..
EXTERNAL ZGEMV, ZLACGV, ZTRMV
@@ -128,51 +202,50 @@
*
IF( LSAME( DIRECT, 'F' ) ) THEN
PREVLASTV = N
- DO 20 I = 1, K
+ DO I = 1, K
PREVLASTV = MAX( PREVLASTV, I )
IF( TAU( I ).EQ.ZERO ) THEN
*
* H(i) = I
*
- DO 10 J = 1, I
+ DO J = 1, I
T( J, I ) = ZERO
- 10 CONTINUE
+ END DO
ELSE
*
* general case
*
- VII = V( I, I )
- V( I, I ) = ONE
IF( LSAME( STOREV, 'C' ) ) THEN
-! Skip any trailing zeros.
+* 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)' * 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,
- $ -TAU( I ), V( I, 1 ), LDV, V( I, I ), 1,
- $ ZERO, T( 1, I ), 1 )
+ 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.
+* 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)'
+* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H
*
- IF( I.LT.J )
- $ CALL ZLACGV( J-I, V( I, I+1 ), LDV )
- CALL ZGEMV( 'No transpose', I-1, J-I+1, -TAU( I ),
- $ 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 )
+ 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
- V( I, I ) = VII
*
* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i)
*
@@ -185,56 +258,52 @@
PREVLASTV = LASTV
END IF
END IF
- 20 CONTINUE
+ END DO
ELSE
PREVLASTV = 1
- DO 40 I = K, 1, -1
+ DO I = K, 1, -1
IF( TAU( I ).EQ.ZERO ) THEN
*
* H(i) = I
*
- DO 30 J = I, K
+ DO J = I, K
T( J, I ) = ZERO
- 30 CONTINUE
+ END DO
ELSE
*
* general case
*
IF( I.LT.K ) THEN
IF( LSAME( STOREV, 'C' ) ) THEN
- VII = V( N-K+I, I )
- V( N-K+I, I ) = ONE
-! Skip any leading zeros.
+* 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)' * V(j:n-k+i,i)
+* 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+1, K-I,
+ CALL ZGEMV( 'Conjugate transpose', N-K+I-J, K-I,
$ -TAU( I ), V( J, I+1 ), LDV, V( J, I ),
- $ 1, ZERO, T( I+1, I ), 1 )
- V( N-K+I, I ) = VII
+ $ 1, ONE, T( I+1, I ), 1 )
ELSE
- VII = V( I, N-K+I )
- V( I, N-K+I ) = ONE
-! Skip any leading zeros.
+* 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)'
+* T(i+1:k,i) = -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 ZGEMV( 'No transpose', K-I, N-K+I-J+1,
- $ -TAU( I ), V( I+1, J ), LDV, V( I, J ), LDV,
- $ ZERO, T( I+1, I ), 1 )
- CALL ZLACGV( N-K+I-1-J+1, V( I, J ), LDV )
- V( I, N-K+I ) = VII
+ 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)
@@ -249,7 +318,7 @@
END IF
T( I, I ) = TAU( I )
END IF
- 40 CONTINUE
+ END DO
END IF
RETURN
*