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