1*bf2c3715SXin Li*> \brief \b ZLARFT 2*bf2c3715SXin Li* 3*bf2c3715SXin Li* =========== DOCUMENTATION =========== 4*bf2c3715SXin Li* 5*bf2c3715SXin Li* Online html documentation available at 6*bf2c3715SXin Li* http://www.netlib.org/lapack/explore-html/ 7*bf2c3715SXin Li* 8*bf2c3715SXin Li*> \htmlonly 9*bf2c3715SXin Li*> Download ZLARFT + dependencies 10*bf2c3715SXin Li*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarft.f"> 11*bf2c3715SXin Li*> [TGZ]</a> 12*bf2c3715SXin Li*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarft.f"> 13*bf2c3715SXin Li*> [ZIP]</a> 14*bf2c3715SXin Li*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarft.f"> 15*bf2c3715SXin Li*> [TXT]</a> 16*bf2c3715SXin Li*> \endhtmlonly 17*bf2c3715SXin Li* 18*bf2c3715SXin Li* Definition: 19*bf2c3715SXin Li* =========== 20*bf2c3715SXin Li* 21*bf2c3715SXin Li* SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) 22*bf2c3715SXin Li* 23*bf2c3715SXin Li* .. Scalar Arguments .. 24*bf2c3715SXin Li* CHARACTER DIRECT, STOREV 25*bf2c3715SXin Li* INTEGER K, LDT, LDV, N 26*bf2c3715SXin Li* .. 27*bf2c3715SXin Li* .. Array Arguments .. 28*bf2c3715SXin Li* COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) 29*bf2c3715SXin Li* .. 30*bf2c3715SXin Li* 31*bf2c3715SXin Li* 32*bf2c3715SXin Li*> \par Purpose: 33*bf2c3715SXin Li* ============= 34*bf2c3715SXin Li*> 35*bf2c3715SXin Li*> \verbatim 36*bf2c3715SXin Li*> 37*bf2c3715SXin Li*> ZLARFT forms the triangular factor T of a complex block reflector H 38*bf2c3715SXin Li*> of order n, which is defined as a product of k elementary reflectors. 39*bf2c3715SXin Li*> 40*bf2c3715SXin Li*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; 41*bf2c3715SXin Li*> 42*bf2c3715SXin Li*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. 43*bf2c3715SXin Li*> 44*bf2c3715SXin Li*> If STOREV = 'C', the vector which defines the elementary reflector 45*bf2c3715SXin Li*> H(i) is stored in the i-th column of the array V, and 46*bf2c3715SXin Li*> 47*bf2c3715SXin Li*> H = I - V * T * V**H 48*bf2c3715SXin Li*> 49*bf2c3715SXin Li*> If STOREV = 'R', the vector which defines the elementary reflector 50*bf2c3715SXin Li*> H(i) is stored in the i-th row of the array V, and 51*bf2c3715SXin Li*> 52*bf2c3715SXin Li*> H = I - V**H * T * V 53*bf2c3715SXin Li*> \endverbatim 54*bf2c3715SXin Li* 55*bf2c3715SXin Li* Arguments: 56*bf2c3715SXin Li* ========== 57*bf2c3715SXin Li* 58*bf2c3715SXin Li*> \param[in] DIRECT 59*bf2c3715SXin Li*> \verbatim 60*bf2c3715SXin Li*> DIRECT is CHARACTER*1 61*bf2c3715SXin Li*> Specifies the order in which the elementary reflectors are 62*bf2c3715SXin Li*> multiplied to form the block reflector: 63*bf2c3715SXin Li*> = 'F': H = H(1) H(2) . . . H(k) (Forward) 64*bf2c3715SXin Li*> = 'B': H = H(k) . . . H(2) H(1) (Backward) 65*bf2c3715SXin Li*> \endverbatim 66*bf2c3715SXin Li*> 67*bf2c3715SXin Li*> \param[in] STOREV 68*bf2c3715SXin Li*> \verbatim 69*bf2c3715SXin Li*> STOREV is CHARACTER*1 70*bf2c3715SXin Li*> Specifies how the vectors which define the elementary 71*bf2c3715SXin Li*> reflectors are stored (see also Further Details): 72*bf2c3715SXin Li*> = 'C': columnwise 73*bf2c3715SXin Li*> = 'R': rowwise 74*bf2c3715SXin Li*> \endverbatim 75*bf2c3715SXin Li*> 76*bf2c3715SXin Li*> \param[in] N 77*bf2c3715SXin Li*> \verbatim 78*bf2c3715SXin Li*> N is INTEGER 79*bf2c3715SXin Li*> The order of the block reflector H. N >= 0. 80*bf2c3715SXin Li*> \endverbatim 81*bf2c3715SXin Li*> 82*bf2c3715SXin Li*> \param[in] K 83*bf2c3715SXin Li*> \verbatim 84*bf2c3715SXin Li*> K is INTEGER 85*bf2c3715SXin Li*> The order of the triangular factor T (= the number of 86*bf2c3715SXin Li*> elementary reflectors). K >= 1. 87*bf2c3715SXin Li*> \endverbatim 88*bf2c3715SXin Li*> 89*bf2c3715SXin Li*> \param[in] V 90*bf2c3715SXin Li*> \verbatim 91*bf2c3715SXin Li*> V is COMPLEX*16 array, dimension 92*bf2c3715SXin Li*> (LDV,K) if STOREV = 'C' 93*bf2c3715SXin Li*> (LDV,N) if STOREV = 'R' 94*bf2c3715SXin Li*> The matrix V. See further details. 95*bf2c3715SXin Li*> \endverbatim 96*bf2c3715SXin Li*> 97*bf2c3715SXin Li*> \param[in] LDV 98*bf2c3715SXin Li*> \verbatim 99*bf2c3715SXin Li*> LDV is INTEGER 100*bf2c3715SXin Li*> The leading dimension of the array V. 101*bf2c3715SXin Li*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. 102*bf2c3715SXin Li*> \endverbatim 103*bf2c3715SXin Li*> 104*bf2c3715SXin Li*> \param[in] TAU 105*bf2c3715SXin Li*> \verbatim 106*bf2c3715SXin Li*> TAU is COMPLEX*16 array, dimension (K) 107*bf2c3715SXin Li*> TAU(i) must contain the scalar factor of the elementary 108*bf2c3715SXin Li*> reflector H(i). 109*bf2c3715SXin Li*> \endverbatim 110*bf2c3715SXin Li*> 111*bf2c3715SXin Li*> \param[out] T 112*bf2c3715SXin Li*> \verbatim 113*bf2c3715SXin Li*> T is COMPLEX*16 array, dimension (LDT,K) 114*bf2c3715SXin Li*> The k by k triangular factor T of the block reflector. 115*bf2c3715SXin Li*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is 116*bf2c3715SXin Li*> lower triangular. The rest of the array is not used. 117*bf2c3715SXin Li*> \endverbatim 118*bf2c3715SXin Li*> 119*bf2c3715SXin Li*> \param[in] LDT 120*bf2c3715SXin Li*> \verbatim 121*bf2c3715SXin Li*> LDT is INTEGER 122*bf2c3715SXin Li*> The leading dimension of the array T. LDT >= K. 123*bf2c3715SXin Li*> \endverbatim 124*bf2c3715SXin Li* 125*bf2c3715SXin Li* Authors: 126*bf2c3715SXin Li* ======== 127*bf2c3715SXin Li* 128*bf2c3715SXin Li*> \author Univ. of Tennessee 129*bf2c3715SXin Li*> \author Univ. of California Berkeley 130*bf2c3715SXin Li*> \author Univ. of Colorado Denver 131*bf2c3715SXin Li*> \author NAG Ltd. 132*bf2c3715SXin Li* 133*bf2c3715SXin Li*> \date April 2012 134*bf2c3715SXin Li* 135*bf2c3715SXin Li*> \ingroup complex16OTHERauxiliary 136*bf2c3715SXin Li* 137*bf2c3715SXin Li*> \par Further Details: 138*bf2c3715SXin Li* ===================== 139*bf2c3715SXin Li*> 140*bf2c3715SXin Li*> \verbatim 141*bf2c3715SXin Li*> 142*bf2c3715SXin Li*> The shape of the matrix V and the storage of the vectors which define 143*bf2c3715SXin Li*> the H(i) is best illustrated by the following example with n = 5 and 144*bf2c3715SXin Li*> k = 3. The elements equal to 1 are not stored. 145*bf2c3715SXin Li*> 146*bf2c3715SXin Li*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': 147*bf2c3715SXin Li*> 148*bf2c3715SXin Li*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) 149*bf2c3715SXin Li*> ( v1 1 ) ( 1 v2 v2 v2 ) 150*bf2c3715SXin Li*> ( v1 v2 1 ) ( 1 v3 v3 ) 151*bf2c3715SXin Li*> ( v1 v2 v3 ) 152*bf2c3715SXin Li*> ( v1 v2 v3 ) 153*bf2c3715SXin Li*> 154*bf2c3715SXin Li*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': 155*bf2c3715SXin Li*> 156*bf2c3715SXin Li*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) 157*bf2c3715SXin Li*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) 158*bf2c3715SXin Li*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) 159*bf2c3715SXin Li*> ( 1 v3 ) 160*bf2c3715SXin Li*> ( 1 ) 161*bf2c3715SXin Li*> \endverbatim 162*bf2c3715SXin Li*> 163*bf2c3715SXin Li* ===================================================================== 164*bf2c3715SXin Li SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) 165*bf2c3715SXin Li* 166*bf2c3715SXin Li* -- LAPACK auxiliary routine (version 3.4.1) -- 167*bf2c3715SXin Li* -- LAPACK is a software package provided by Univ. of Tennessee, -- 168*bf2c3715SXin Li* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 169*bf2c3715SXin Li* April 2012 170*bf2c3715SXin Li* 171*bf2c3715SXin Li* .. Scalar Arguments .. 172*bf2c3715SXin Li CHARACTER DIRECT, STOREV 173*bf2c3715SXin Li INTEGER K, LDT, LDV, N 174*bf2c3715SXin Li* .. 175*bf2c3715SXin Li* .. Array Arguments .. 176*bf2c3715SXin Li COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) 177*bf2c3715SXin Li* .. 178*bf2c3715SXin Li* 179*bf2c3715SXin Li* ===================================================================== 180*bf2c3715SXin Li* 181*bf2c3715SXin Li* .. Parameters .. 182*bf2c3715SXin Li COMPLEX*16 ONE, ZERO 183*bf2c3715SXin Li PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), 184*bf2c3715SXin Li $ ZERO = ( 0.0D+0, 0.0D+0 ) ) 185*bf2c3715SXin Li* .. 186*bf2c3715SXin Li* .. Local Scalars .. 187*bf2c3715SXin Li INTEGER I, J, PREVLASTV, LASTV 188*bf2c3715SXin Li* .. 189*bf2c3715SXin Li* .. External Subroutines .. 190*bf2c3715SXin Li EXTERNAL ZGEMV, ZLACGV, ZTRMV 191*bf2c3715SXin Li* .. 192*bf2c3715SXin Li* .. External Functions .. 193*bf2c3715SXin Li LOGICAL LSAME 194*bf2c3715SXin Li EXTERNAL LSAME 195*bf2c3715SXin Li* .. 196*bf2c3715SXin Li* .. Executable Statements .. 197*bf2c3715SXin Li* 198*bf2c3715SXin Li* Quick return if possible 199*bf2c3715SXin Li* 200*bf2c3715SXin Li IF( N.EQ.0 ) 201*bf2c3715SXin Li $ RETURN 202*bf2c3715SXin Li* 203*bf2c3715SXin Li IF( LSAME( DIRECT, 'F' ) ) THEN 204*bf2c3715SXin Li PREVLASTV = N 205*bf2c3715SXin Li DO I = 1, K 206*bf2c3715SXin Li PREVLASTV = MAX( PREVLASTV, I ) 207*bf2c3715SXin Li IF( TAU( I ).EQ.ZERO ) THEN 208*bf2c3715SXin Li* 209*bf2c3715SXin Li* H(i) = I 210*bf2c3715SXin Li* 211*bf2c3715SXin Li DO J = 1, I 212*bf2c3715SXin Li T( J, I ) = ZERO 213*bf2c3715SXin Li END DO 214*bf2c3715SXin Li ELSE 215*bf2c3715SXin Li* 216*bf2c3715SXin Li* general case 217*bf2c3715SXin Li* 218*bf2c3715SXin Li IF( LSAME( STOREV, 'C' ) ) THEN 219*bf2c3715SXin Li* Skip any trailing zeros. 220*bf2c3715SXin Li DO LASTV = N, I+1, -1 221*bf2c3715SXin Li IF( V( LASTV, I ).NE.ZERO ) EXIT 222*bf2c3715SXin Li END DO 223*bf2c3715SXin Li DO J = 1, I-1 224*bf2c3715SXin Li T( J, I ) = -TAU( I ) * CONJG( V( I , J ) ) 225*bf2c3715SXin Li END DO 226*bf2c3715SXin Li J = MIN( LASTV, PREVLASTV ) 227*bf2c3715SXin Li* 228*bf2c3715SXin Li* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) 229*bf2c3715SXin Li* 230*bf2c3715SXin Li CALL ZGEMV( 'Conjugate transpose', J-I, I-1, 231*bf2c3715SXin Li $ -TAU( I ), V( I+1, 1 ), LDV, 232*bf2c3715SXin Li $ V( I+1, I ), 1, ONE, T( 1, I ), 1 ) 233*bf2c3715SXin Li ELSE 234*bf2c3715SXin Li* Skip any trailing zeros. 235*bf2c3715SXin Li DO LASTV = N, I+1, -1 236*bf2c3715SXin Li IF( V( I, LASTV ).NE.ZERO ) EXIT 237*bf2c3715SXin Li END DO 238*bf2c3715SXin Li DO J = 1, I-1 239*bf2c3715SXin Li T( J, I ) = -TAU( I ) * V( J , I ) 240*bf2c3715SXin Li END DO 241*bf2c3715SXin Li J = MIN( LASTV, PREVLASTV ) 242*bf2c3715SXin Li* 243*bf2c3715SXin Li* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H 244*bf2c3715SXin Li* 245*bf2c3715SXin Li CALL ZGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ), 246*bf2c3715SXin Li $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, 247*bf2c3715SXin Li $ ONE, T( 1, I ), LDT ) 248*bf2c3715SXin Li END IF 249*bf2c3715SXin Li* 250*bf2c3715SXin Li* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) 251*bf2c3715SXin Li* 252*bf2c3715SXin Li CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, 253*bf2c3715SXin Li $ LDT, T( 1, I ), 1 ) 254*bf2c3715SXin Li T( I, I ) = TAU( I ) 255*bf2c3715SXin Li IF( I.GT.1 ) THEN 256*bf2c3715SXin Li PREVLASTV = MAX( PREVLASTV, LASTV ) 257*bf2c3715SXin Li ELSE 258*bf2c3715SXin Li PREVLASTV = LASTV 259*bf2c3715SXin Li END IF 260*bf2c3715SXin Li END IF 261*bf2c3715SXin Li END DO 262*bf2c3715SXin Li ELSE 263*bf2c3715SXin Li PREVLASTV = 1 264*bf2c3715SXin Li DO I = K, 1, -1 265*bf2c3715SXin Li IF( TAU( I ).EQ.ZERO ) THEN 266*bf2c3715SXin Li* 267*bf2c3715SXin Li* H(i) = I 268*bf2c3715SXin Li* 269*bf2c3715SXin Li DO J = I, K 270*bf2c3715SXin Li T( J, I ) = ZERO 271*bf2c3715SXin Li END DO 272*bf2c3715SXin Li ELSE 273*bf2c3715SXin Li* 274*bf2c3715SXin Li* general case 275*bf2c3715SXin Li* 276*bf2c3715SXin Li IF( I.LT.K ) THEN 277*bf2c3715SXin Li IF( LSAME( STOREV, 'C' ) ) THEN 278*bf2c3715SXin Li* Skip any leading zeros. 279*bf2c3715SXin Li DO LASTV = 1, I-1 280*bf2c3715SXin Li IF( V( LASTV, I ).NE.ZERO ) EXIT 281*bf2c3715SXin Li END DO 282*bf2c3715SXin Li DO J = I+1, K 283*bf2c3715SXin Li T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) ) 284*bf2c3715SXin Li END DO 285*bf2c3715SXin Li J = MAX( LASTV, PREVLASTV ) 286*bf2c3715SXin Li* 287*bf2c3715SXin Li* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) 288*bf2c3715SXin Li* 289*bf2c3715SXin Li CALL ZGEMV( 'Conjugate transpose', N-K+I-J, K-I, 290*bf2c3715SXin Li $ -TAU( I ), V( J, I+1 ), LDV, V( J, I ), 291*bf2c3715SXin Li $ 1, ONE, T( I+1, I ), 1 ) 292*bf2c3715SXin Li ELSE 293*bf2c3715SXin Li* Skip any leading zeros. 294*bf2c3715SXin Li DO LASTV = 1, I-1 295*bf2c3715SXin Li IF( V( I, LASTV ).NE.ZERO ) EXIT 296*bf2c3715SXin Li END DO 297*bf2c3715SXin Li DO J = I+1, K 298*bf2c3715SXin Li T( J, I ) = -TAU( I ) * V( J, N-K+I ) 299*bf2c3715SXin Li END DO 300*bf2c3715SXin Li J = MAX( LASTV, PREVLASTV ) 301*bf2c3715SXin Li* 302*bf2c3715SXin Li* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H 303*bf2c3715SXin Li* 304*bf2c3715SXin Li CALL ZGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ), 305*bf2c3715SXin Li $ V( I+1, J ), LDV, V( I, J ), LDV, 306*bf2c3715SXin Li $ ONE, T( I+1, I ), LDT ) 307*bf2c3715SXin Li END IF 308*bf2c3715SXin Li* 309*bf2c3715SXin Li* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) 310*bf2c3715SXin Li* 311*bf2c3715SXin Li CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, 312*bf2c3715SXin Li $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) 313*bf2c3715SXin Li IF( I.GT.1 ) THEN 314*bf2c3715SXin Li PREVLASTV = MIN( PREVLASTV, LASTV ) 315*bf2c3715SXin Li ELSE 316*bf2c3715SXin Li PREVLASTV = LASTV 317*bf2c3715SXin Li END IF 318*bf2c3715SXin Li END IF 319*bf2c3715SXin Li T( I, I ) = TAU( I ) 320*bf2c3715SXin Li END IF 321*bf2c3715SXin Li END DO 322*bf2c3715SXin Li END IF 323*bf2c3715SXin Li RETURN 324*bf2c3715SXin Li* 325*bf2c3715SXin Li* End of ZLARFT 326*bf2c3715SXin Li* 327*bf2c3715SXin Li END 328