1*bf2c3715SXin Li*> \brief \b CLARFT 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 CLARFT + dependencies 10*bf2c3715SXin Li*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarft.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/clarft.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/clarft.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 CLARFT( 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 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*> CLARFT 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 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 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 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 complexOTHERauxiliary 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 CLARFT( 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 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 ONE, ZERO 183*bf2c3715SXin Li PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ), 184*bf2c3715SXin Li $ ZERO = ( 0.0E+0, 0.0E+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 CGEMV, CLACGV, CTRMV 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 CGEMV( 'Conjugate transpose', J-I, I-1, 231*bf2c3715SXin Li $ -TAU( I ), V( I+1, 1 ), LDV, 232*bf2c3715SXin Li $ V( I+1, I ), 1, 233*bf2c3715SXin Li $ ONE, T( 1, I ), 1 ) 234*bf2c3715SXin Li ELSE 235*bf2c3715SXin Li* Skip any trailing zeros. 236*bf2c3715SXin Li DO LASTV = N, I+1, -1 237*bf2c3715SXin Li IF( V( I, LASTV ).NE.ZERO ) EXIT 238*bf2c3715SXin Li END DO 239*bf2c3715SXin Li DO J = 1, I-1 240*bf2c3715SXin Li T( J, I ) = -TAU( I ) * V( J , I ) 241*bf2c3715SXin Li END DO 242*bf2c3715SXin Li J = MIN( LASTV, PREVLASTV ) 243*bf2c3715SXin Li* 244*bf2c3715SXin Li* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H 245*bf2c3715SXin Li* 246*bf2c3715SXin Li CALL CGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ), 247*bf2c3715SXin Li $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, 248*bf2c3715SXin Li $ ONE, T( 1, I ), LDT ) 249*bf2c3715SXin Li END IF 250*bf2c3715SXin Li* 251*bf2c3715SXin Li* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) 252*bf2c3715SXin Li* 253*bf2c3715SXin Li CALL CTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, 254*bf2c3715SXin Li $ LDT, T( 1, I ), 1 ) 255*bf2c3715SXin Li T( I, I ) = TAU( I ) 256*bf2c3715SXin Li IF( I.GT.1 ) THEN 257*bf2c3715SXin Li PREVLASTV = MAX( PREVLASTV, LASTV ) 258*bf2c3715SXin Li ELSE 259*bf2c3715SXin Li PREVLASTV = LASTV 260*bf2c3715SXin Li END IF 261*bf2c3715SXin Li END IF 262*bf2c3715SXin Li END DO 263*bf2c3715SXin Li ELSE 264*bf2c3715SXin Li PREVLASTV = 1 265*bf2c3715SXin Li DO I = K, 1, -1 266*bf2c3715SXin Li IF( TAU( I ).EQ.ZERO ) THEN 267*bf2c3715SXin Li* 268*bf2c3715SXin Li* H(i) = I 269*bf2c3715SXin Li* 270*bf2c3715SXin Li DO J = I, K 271*bf2c3715SXin Li T( J, I ) = ZERO 272*bf2c3715SXin Li END DO 273*bf2c3715SXin Li ELSE 274*bf2c3715SXin Li* 275*bf2c3715SXin Li* general case 276*bf2c3715SXin Li* 277*bf2c3715SXin Li IF( I.LT.K ) THEN 278*bf2c3715SXin Li IF( LSAME( STOREV, 'C' ) ) THEN 279*bf2c3715SXin Li* Skip any leading zeros. 280*bf2c3715SXin Li DO LASTV = 1, I-1 281*bf2c3715SXin Li IF( V( LASTV, I ).NE.ZERO ) EXIT 282*bf2c3715SXin Li END DO 283*bf2c3715SXin Li DO J = I+1, K 284*bf2c3715SXin Li T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) ) 285*bf2c3715SXin Li END DO 286*bf2c3715SXin Li J = MAX( LASTV, PREVLASTV ) 287*bf2c3715SXin Li* 288*bf2c3715SXin Li* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) 289*bf2c3715SXin Li* 290*bf2c3715SXin Li CALL CGEMV( 'Conjugate transpose', N-K+I-J, K-I, 291*bf2c3715SXin Li $ -TAU( I ), V( J, I+1 ), LDV, V( J, I ), 292*bf2c3715SXin Li $ 1, ONE, T( I+1, I ), 1 ) 293*bf2c3715SXin Li ELSE 294*bf2c3715SXin Li* Skip any leading zeros. 295*bf2c3715SXin Li DO LASTV = 1, I-1 296*bf2c3715SXin Li IF( V( I, LASTV ).NE.ZERO ) EXIT 297*bf2c3715SXin Li END DO 298*bf2c3715SXin Li DO J = I+1, K 299*bf2c3715SXin Li T( J, I ) = -TAU( I ) * V( J, N-K+I ) 300*bf2c3715SXin Li END DO 301*bf2c3715SXin Li J = MAX( LASTV, PREVLASTV ) 302*bf2c3715SXin Li* 303*bf2c3715SXin Li* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H 304*bf2c3715SXin Li* 305*bf2c3715SXin Li CALL CGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ), 306*bf2c3715SXin Li $ V( I+1, J ), LDV, V( I, J ), LDV, 307*bf2c3715SXin Li $ ONE, T( I+1, I ), LDT ) 308*bf2c3715SXin Li END IF 309*bf2c3715SXin Li* 310*bf2c3715SXin Li* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) 311*bf2c3715SXin Li* 312*bf2c3715SXin Li CALL CTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, 313*bf2c3715SXin Li $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) 314*bf2c3715SXin Li IF( I.GT.1 ) THEN 315*bf2c3715SXin Li PREVLASTV = MIN( PREVLASTV, LASTV ) 316*bf2c3715SXin Li ELSE 317*bf2c3715SXin Li PREVLASTV = LASTV 318*bf2c3715SXin Li END IF 319*bf2c3715SXin Li END IF 320*bf2c3715SXin Li T( I, I ) = TAU( I ) 321*bf2c3715SXin Li END IF 322*bf2c3715SXin Li END DO 323*bf2c3715SXin Li END IF 324*bf2c3715SXin Li RETURN 325*bf2c3715SXin Li* 326*bf2c3715SXin Li* End of CLARFT 327*bf2c3715SXin Li* 328*bf2c3715SXin Li END 329