@@ -147,7 +147,7 @@ SUBROUTINE DLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
147
147
* ..
148
148
* .. Local Scalars ..
149
149
LOGICAL APPLYLEFT
150
- INTEGER I, LASTV, LASTC, J
150
+ INTEGER I, LASTV, LASTC, J, FIRSTV
151
151
* ..
152
152
* .. External Subroutines ..
153
153
EXTERNAL DGEMV, DGER
@@ -160,7 +160,7 @@ SUBROUTINE DLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
160
160
* .. Executable Statements ..
161
161
*
162
162
APPLYLEFT = LSAME( SIDE, ' L' )
163
- LASTV = 0
163
+ FIRSTV = 1
164
164
LASTC = 0
165
165
IF ( TAU.NE. ZERO ) THEN
166
166
! Set up variables for scanning V. LASTV begins pointing to the end
@@ -170,7 +170,12 @@ SUBROUTINE DLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
170
170
ELSE
171
171
LASTV = N
172
172
END IF
173
+ I = 1
173
174
! Look for the last non- zero row in V.
175
+ DO WHILE ( LASTV.GT. FIRSTV .AND. V( I ).EQ. ZERO )
176
+ FIRSTV = FIRSTV + 1
177
+ I = I + INCV
178
+ END DO
174
179
IF ( APPLYLEFT ) THEN
175
180
! Scan for the last non- zero column in C(1 :lastv,:).
176
181
LASTC = ILADLC(LASTV, N, C, LDC)
@@ -190,15 +195,16 @@ SUBROUTINE DLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
190
195
IF ( LASTV.GT. 0 ) THEN
191
196
! Check if m = 1 . This means v = 1 , So we just need to compute
192
197
! C := HC = (1 - \tau)C.
193
- IF ( LASTV.EQ. 1 ) THEN
194
- CALL DSCAL(LASTC, ONE - TAU, C, LDC)
198
+ IF ( LASTV.EQ. FIRSTV ) THEN
199
+ CALL DSCAL(LASTC, ONE - TAU, C( FIRSTV, 1 ) , LDC)
195
200
ELSE
196
201
*
197
202
* w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1)
198
203
*
199
204
! w(1 :lastc,1 ) := C(1 :lastv-1 ,1 :lastc)** T * v(1 :lastv-1 ,1 )
200
- CALL DGEMV( ' Transpose' , LASTV-1 , LASTC, ONE, C(1 ,1 ),
201
- $ LDC, V(1 ), INCV, ZERO, WORK, 1 )
205
+ CALL DGEMV( ' Transpose' , LASTV- FIRSTV, LASTC, ONE,
206
+ $ C(FIRSTV,1 ), LDC, V(I), INCV, ZERO,
207
+ $ WORK, 1 )
202
208
! w(1 :lastc,1 ) += C(lastv,1 :lastc)** T * v(lastv,1 ) = C(lastv,1 :lastc)** T
203
209
CALL DAXPY(LASTC, ONE, C(LASTV,1 ), LDC, WORK, 1 )
204
210
*
@@ -208,8 +214,8 @@ SUBROUTINE DLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
208
214
! = C(...) - tau * w(1 :lastc,1 )** T
209
215
CALL DAXPY(LASTC, - TAU, WORK, 1 , C(LASTV,1 ), LDC)
210
216
! C(1 :lastv-1 ,1 :lastc) := C(...) - tau * v(1 :lastv-1 ,1 )* w(1 :lastc,1 )** T
211
- CALL DGER(LASTV-1 , LASTC, - TAU, V(1 ), INCV, WORK, 1 ,
212
- $ C(1 ,1 ), LDC)
217
+ CALL DGER(LASTV- FIRSTV , LASTC, - TAU, V(I ), INCV,
218
+ $ WORK, 1 , C(FIRSTV ,1 ), LDC)
213
219
END IF
214
220
END IF
215
221
ELSE
@@ -219,15 +225,15 @@ SUBROUTINE DLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
219
225
IF ( LASTV.GT. 0 ) THEN
220
226
! Check if n = 1 . This means v = 1 , so we just need to compute
221
227
! C := CH = C(1 - \tau).
222
- IF ( LASTV.EQ. 1 ) THEN
228
+ IF ( LASTV.EQ. FIRSTV ) THEN
223
229
CALL DSCAL(LASTC, ONE - TAU, C, 1 )
224
230
ELSE
225
231
*
226
232
* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1)
227
233
*
228
234
! w(1 :lastc,1 ) := C(1 :lastc,1 :lastv-1 ) * v(1 :lastv-1 ,1 )
229
- CALL DGEMV( ' No transpose' , LASTC, LASTV-1 , ONE,
230
- $ C(1 ,1 ), LDC, V(1 ), INCV, ZERO, WORK, 1 )
235
+ CALL DGEMV( ' No transpose' , LASTC, LASTV- FIRSTV,
236
+ $ ONE, C(1 ,FIRSTV ), LDC, V(I ), INCV, ZERO, WORK, 1 )
231
237
! w(1 :lastc,1 ) += C(1 :lastc,lastv) * v(lastv,1 ) = C(1 :lastc,lastv)
232
238
CALL DAXPY(LASTC, ONE, C(1 ,LASTV), 1 , WORK, 1 )
233
239
*
@@ -237,8 +243,8 @@ SUBROUTINE DLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
237
243
! = C(...) - tau * w(1 :lastc,1 )
238
244
CALL DAXPY(LASTC, - TAU, WORK, 1 , C(1 ,LASTV), 1 )
239
245
! C(1 :lastc,1 :lastv-1 ) := C(...) - tau * w(1 :lastc,1 ) * v(1 :lastv-1 )** T
240
- CALL DGER( LASTC, LASTV-1 , - TAU, WORK, 1 , V(1 ),
241
- $ INCV, C(1 ,1 ), LDC )
246
+ CALL DGER( LASTC, LASTV- FIRSTV , - TAU, WORK, 1 , V(I ),
247
+ $ INCV, C(1 ,FIRSTV ), LDC )
242
248
END IF
243
249
END IF
244
250
END IF
0 commit comments