1 *> \brief \b SLARFT 2 * 3 * =========== DOCUMENTATION =========== 4 * 5 * Online html documentation available at 6 * http://www.netlib.org/lapack/explore-html/ 7 * 8 *> \htmlonly 9 *> Download SLARFT + dependencies 10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slarft.f"> 11 *> [TGZ]</a> 12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slarft.f"> 13 *> [ZIP]</a> 14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slarft.f"> 15 *> [TXT]</a> 16 *> \endhtmlonly 17 * 18 * Definition: 19 * =========== 20 * 21 * SUBROUTINE SLARFT( 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 * REAL T( LDT, * ), TAU( * ), V( LDV, * ) 29 * .. 30 * 31 * 32 *> \par Purpose: 33 * ============= 34 *> 35 *> \verbatim 36 *> 37 *> SLARFT forms the triangular factor T of a real 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**T 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**T * 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 REAL 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 REAL 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 REAL 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 realOTHERauxiliary 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 SLARFT( 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 REAL T( LDT, * ), TAU( * ), V( LDV, * ) 177 * .. 178 * 179 * ===================================================================== 180 * 181 * .. Parameters .. 182 REAL ONE, ZERO 183 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) 184 * .. 185 * .. Local Scalars .. 186 INTEGER I, J, PREVLASTV, LASTV 187 * .. 188 * .. External Subroutines .. 189 EXTERNAL SGEMV, STRMV 190 * .. 191 * .. External Functions .. 192 LOGICAL LSAME 193 EXTERNAL LSAME 194 * .. 195 * .. Executable Statements .. 196 * 197 * Quick return if possible 198 * 199 IF( N.EQ.0 ) 200 $ RETURN 201 * 202 IF( LSAME( DIRECT, 'F' ) ) THEN 203 PREVLASTV = N 204 DO I = 1, K 205 PREVLASTV = MAX( I, PREVLASTV ) 206 IF( TAU( I ).EQ.ZERO ) THEN 207 * 208 * H(i) = I 209 * 210 DO J = 1, I 211 T( J, I ) = ZERO 212 END DO 213 ELSE 214 * 215 * general case 216 * 217 IF( LSAME( STOREV, 'C' ) ) THEN 218 * Skip any trailing zeros. 219 DO LASTV = N, I+1, -1 220 IF( V( LASTV, I ).NE.ZERO ) EXIT 221 END DO 222 DO J = 1, I-1 223 T( J, I ) = -TAU( I ) * V( I , J ) 224 END DO 225 J = MIN( LASTV, PREVLASTV ) 226 * 227 * T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i) 228 * 229 CALL SGEMV( 'Transpose', J-I, I-1, -TAU( I ), 230 $ V( I+1, 1 ), LDV, V( I+1, I ), 1, ONE, 231 $ T( 1, I ), 1 ) 232 ELSE 233 * Skip any trailing zeros. 234 DO LASTV = N, I+1, -1 235 IF( V( I, LASTV ).NE.ZERO ) EXIT 236 END DO 237 DO J = 1, I-1 238 T( J, I ) = -TAU( I ) * V( J , I ) 239 END DO 240 J = MIN( LASTV, PREVLASTV ) 241 * 242 * T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T 243 * 244 CALL SGEMV( 'No transpose', I-1, J-I, -TAU( I ), 245 $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, 246 $ ONE, T( 1, I ), 1 ) 247 END IF 248 * 249 * T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) 250 * 251 CALL STRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, 252 $ LDT, T( 1, I ), 1 ) 253 T( I, I ) = TAU( I ) 254 IF( I.GT.1 ) THEN 255 PREVLASTV = MAX( PREVLASTV, LASTV ) 256 ELSE 257 PREVLASTV = LASTV 258 END IF 259 END IF 260 END DO 261 ELSE 262 PREVLASTV = 1 263 DO I = K, 1, -1 264 IF( TAU( I ).EQ.ZERO ) THEN 265 * 266 * H(i) = I 267 * 268 DO J = I, K 269 T( J, I ) = ZERO 270 END DO 271 ELSE 272 * 273 * general case 274 * 275 IF( I.LT.K ) THEN 276 IF( LSAME( STOREV, 'C' ) ) THEN 277 * Skip any leading zeros. 278 DO LASTV = 1, I-1 279 IF( V( LASTV, I ).NE.ZERO ) EXIT 280 END DO 281 DO J = I+1, K 282 T( J, I ) = -TAU( I ) * V( N-K+I , J ) 283 END DO 284 J = MAX( LASTV, PREVLASTV ) 285 * 286 * T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i) 287 * 288 CALL SGEMV( 'Transpose', N-K+I-J, K-I, -TAU( I ), 289 $ V( J, I+1 ), LDV, V( J, I ), 1, ONE, 290 $ T( I+1, I ), 1 ) 291 ELSE 292 * Skip any leading zeros. 293 DO LASTV = 1, I-1 294 IF( V( I, LASTV ).NE.ZERO ) EXIT 295 END DO 296 DO J = I+1, K 297 T( J, I ) = -TAU( I ) * V( J, N-K+I ) 298 END DO 299 J = MAX( LASTV, PREVLASTV ) 300 * 301 * T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T 302 * 303 CALL SGEMV( 'No transpose', K-I, N-K+I-J, 304 $ -TAU( I ), V( I+1, J ), LDV, V( I, J ), LDV, 305 $ ONE, T( I+1, I ), 1 ) 306 END IF 307 * 308 * T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) 309 * 310 CALL STRMV( 'Lower', 'No transpose', 'Non-unit', K-I, 311 $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) 312 IF( I.GT.1 ) THEN 313 PREVLASTV = MIN( PREVLASTV, LASTV ) 314 ELSE 315 PREVLASTV = LASTV 316 END IF 317 END IF 318 T( I, I ) = TAU( I ) 319 END IF 320 END DO 321 END IF 322 RETURN 323 * 324 * End of SLARFT 325 * 326 END 327