00001 SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
00002
00003
00004
00005
00006
00007
00008
00009 CHARACTER DIRECT, STOREV
00010 INTEGER K, LDT, LDV, N
00011
00012
00013 COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * )
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 COMPLEX*16 ONE, ZERO
00108 PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ),
00109 $ ZERO = ( 0.0D+0, 0.0D+0 ) )
00110
00111
00112 INTEGER I, J, PREVLASTV, LASTV
00113 COMPLEX*16 VII
00114
00115
00116 EXTERNAL ZGEMV, ZLACGV, ZTRMV
00117
00118
00119 LOGICAL LSAME
00120 EXTERNAL LSAME
00121
00122
00123
00124
00125
00126 IF( N.EQ.0 )
00127 $ RETURN
00128
00129 IF( LSAME( DIRECT, 'F' ) ) THEN
00130 PREVLASTV = N
00131 DO 20 I = 1, K
00132 PREVLASTV = MAX( PREVLASTV, I )
00133 IF( TAU( I ).EQ.ZERO ) THEN
00134
00135
00136
00137 DO 10 J = 1, I
00138 T( J, I ) = ZERO
00139 10 CONTINUE
00140 ELSE
00141
00142
00143
00144 VII = V( I, I )
00145 V( I, I ) = ONE
00146 IF( LSAME( STOREV, 'C' ) ) THEN
00147
00148 DO LASTV = N, I+1, -1
00149 IF( V( LASTV, I ).NE.ZERO ) EXIT
00150 END DO
00151 J = MIN( LASTV, PREVLASTV )
00152
00153
00154
00155 CALL ZGEMV( 'Conjugate transpose', J-I+1, I-1,
00156 $ -TAU( I ), V( I, 1 ), LDV, V( I, I ), 1,
00157 $ ZERO, T( 1, I ), 1 )
00158 ELSE
00159
00160 DO LASTV = N, I+1, -1
00161 IF( V( I, LASTV ).NE.ZERO ) EXIT
00162 END DO
00163 J = MIN( LASTV, PREVLASTV )
00164
00165
00166
00167 IF( I.LT.J )
00168 $ CALL ZLACGV( J-I, V( I, I+1 ), LDV )
00169 CALL ZGEMV( 'No transpose', I-1, J-I+1, -TAU( I ),
00170 $ V( 1, I ), LDV, V( I, I ), LDV, ZERO,
00171 $ T( 1, I ), 1 )
00172 IF( I.LT.J )
00173 $ CALL ZLACGV( J-I, V( I, I+1 ), LDV )
00174 END IF
00175 V( I, I ) = VII
00176
00177
00178
00179 CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T,
00180 $ LDT, T( 1, I ), 1 )
00181 T( I, I ) = TAU( I )
00182 IF( I.GT.1 ) THEN
00183 PREVLASTV = MAX( PREVLASTV, LASTV )
00184 ELSE
00185 PREVLASTV = LASTV
00186 END IF
00187 END IF
00188 20 CONTINUE
00189 ELSE
00190 PREVLASTV = 1
00191 DO 40 I = K, 1, -1
00192 IF( TAU( I ).EQ.ZERO ) THEN
00193
00194
00195
00196 DO 30 J = I, K
00197 T( J, I ) = ZERO
00198 30 CONTINUE
00199 ELSE
00200
00201
00202
00203 IF( I.LT.K ) THEN
00204 IF( LSAME( STOREV, 'C' ) ) THEN
00205 VII = V( N-K+I, I )
00206 V( N-K+I, I ) = ONE
00207
00208 DO LASTV = 1, I-1
00209 IF( V( LASTV, I ).NE.ZERO ) EXIT
00210 END DO
00211 J = MAX( LASTV, PREVLASTV )
00212
00213
00214
00215
00216 CALL ZGEMV( 'Conjugate transpose', N-K+I-J+1, K-I,
00217 $ -TAU( I ), V( J, I+1 ), LDV, V( J, I ),
00218 $ 1, ZERO, T( I+1, I ), 1 )
00219 V( N-K+I, I ) = VII
00220 ELSE
00221 VII = V( I, N-K+I )
00222 V( I, N-K+I ) = ONE
00223
00224 DO LASTV = 1, I-1
00225 IF( V( I, LASTV ).NE.ZERO ) EXIT
00226 END DO
00227 J = MAX( LASTV, PREVLASTV )
00228
00229
00230
00231
00232 CALL ZLACGV( N-K+I-1-J+1, V( I, J ), LDV )
00233 CALL ZGEMV( 'No transpose', K-I, N-K+I-J+1,
00234 $ -TAU( I ), V( I+1, J ), LDV, V( I, J ), LDV,
00235 $ ZERO, T( I+1, I ), 1 )
00236 CALL ZLACGV( N-K+I-1-J+1, V( I, J ), LDV )
00237 V( I, N-K+I ) = VII
00238 END IF
00239
00240
00241
00242 CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I,
00243 $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 )
00244 IF( I.GT.1 ) THEN
00245 PREVLASTV = MIN( PREVLASTV, LASTV )
00246 ELSE
00247 PREVLASTV = LASTV
00248 END IF
00249 END IF
00250 T( I, I ) = TAU( I )
00251 END IF
00252 40 CONTINUE
00253 END IF
00254 RETURN
00255
00256
00257
00258 END