1
- * > \brief \b DLARF1F applies an elementary reflector to a general rectangular matrix.
1
+ * > \brief \b DLARF1F applies an elementary reflector to a general rectangular
2
+ * matrix assuming v(1) = 1.
2
3
*
3
4
* =========== DOCUMENTATION ===========
4
5
*
35
36
* >
36
37
* > \verbatim
37
38
* >
38
- * > DLARF applies a real elementary reflector H to a real m by n matrix
39
+ * > DLARF1F applies a real elementary reflector H to a real m by n matrix
39
40
* > C, from either the left or the right. H is represented in the form
40
41
* >
41
42
* > H = I - tau * v * v**T
42
43
* >
43
- * > where tau is a real scalar and v is a real vector.
44
+ * > where tau is a real scalar and v is a real vector assuming v(1) = 1 .
44
45
* >
45
46
* > If tau = 0, then H is taken to be the unit matrix.
46
47
* > \endverbatim
117
118
* > \author Univ. of Colorado Denver
118
119
* > \author NAG Ltd.
119
120
*
120
- * > \ingroup larf
121
+ * > \ingroup larf1f
121
122
*
122
123
* =====================================================================
123
124
SUBROUTINE DLARF1F ( SIDE , M , N , V , INCV , TAU , C , LDC , WORK )
@@ -144,10 +145,9 @@ SUBROUTINE DLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
144
145
* .. Local Scalars ..
145
146
LOGICAL APPLYLEFT
146
147
INTEGER I, LASTV, LASTC
147
- DOUBLE PRECISION C11, DOT1, DDOT
148
148
* ..
149
149
* .. External Subroutines ..
150
- EXTERNAL DGEMV, DGER, DDOT, DAXPY, DCOPY, DSCAL
150
+ EXTERNAL DGEMV, DGER, DAXPY
151
151
* ..
152
152
* .. External Functions ..
153
153
LOGICAL LSAME
@@ -185,84 +185,66 @@ SUBROUTINE DLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
185
185
LASTC = ILADLR(M, LASTV, C, LDC)
186
186
END IF
187
187
END IF
188
-
189
188
IF ( LASTC.EQ. 0 .OR. LASTV.EQ. 0 ) THEN
190
189
RETURN
191
190
END IF
192
-
193
191
IF ( APPLYLEFT ) THEN
194
192
*
195
193
* Form H * C
196
194
*
197
195
IF ( LASTV.EQ. 1 ) THEN
198
- CALL DSCAL(LASTC, ONE - TAU, C, LDC)
199
- ELSE
200
- DOT1 = - TAU * DDOT( LASTV - 1 , V( 1 + INCV ), INCV,
201
- $ C( 2 , 1 ), 1 )
202
-
203
- C11 = (ONE - TAU) * C( 1 , 1 ) + DOT1
204
196
*
205
- * Prepare WORK
197
+ * C(1,1:lastc) := ( 1 - tau ) * C(1,1:lastc)
206
198
*
207
- CALL DCOPY( LASTC - 1 , C( 1 , 2 ), LDC, WORK, 1 )
208
-
209
- CALL DGEMV( ' Transpose' , LASTV - 1 , LASTC - 1 , - TAU,
210
- $ C( 2 , 2 ), LDC, V( 1 + INCV ), INCV, - TAU, WORK, 1 )
199
+ CALL DSCAL( LASTC, ONE - TAU, C, LDC )
200
+ ELSE
211
201
*
212
- * Update C12
202
+ * w(1:lastc,1) := C(2:lastv,1:lastc)**T * v(2:lastv,1)
213
203
*
214
- CALL DAXPY( LASTC - 1 , ONE, WORK, 1 , C( 1 , 2 ), LDC )
204
+ CALL DGEMV( ' Transpose' , LASTV - 1 , LASTC, ONE, C( 2 , 1 ),
205
+ $ LDC, V( 1 + INCV ), INCV, ZERO, WORK, 1 )
215
206
*
216
- * Update C21
207
+ * w(1:lastc,1) += C(1,1:lastc)**T * v(1,1)
217
208
*
218
- CALL DAXPY( LASTV - 1 , - TAU * C( 1 , 1 ) + DOT1,
219
- $ V( 1 + INCV ), INCV, C( 2 , 1 ), 1 )
209
+ CALL DAXPY( LASTC, ONE, C, LDC, WORK, 1 )
220
210
*
221
- * Update C11
211
+ * C(1, 1:lastc) := C(...) - tau * w(1:lastc,1)**T
222
212
*
223
- C( 1 , 1 ) = C11
213
+ CALL DAXPY( LASTC, - TAU, WORK , 1 , C, LDC )
224
214
*
225
- * Update C22
215
+ * C(2:lastv,1:lastc) := C(...) - tau * v(2:lastv,1)*w(1:lastc,1)**T
226
216
*
227
- CALL DGER( LASTV - 1 , LASTC - 1 , ONE, V( 1 + INCV ),
228
- $ INCV, WORK, 1 , C( 2 , 2 ), LDC )
229
- END IF
217
+ CALL DGER( LASTV - 1 , LASTC, - TAU, V( 1 + INCV ), INCV, WORK ,
218
+ $ 1 , C( 2 , 1 ), LDC )
219
+ END IF
230
220
ELSE
231
221
*
232
222
* Form C * H
233
223
*
234
224
IF ( LASTV.EQ. 1 ) THEN
235
- CALL DSCAL(LASTC, ONE - TAU, C, 1 )
236
- ELSE
237
- DOT1 = - TAU * DDOT( LASTV - 1 , V( 1 + INCV ), INCV,
238
- $ C( 1 , 2 ), LDC )
239
-
240
- C11 = (ONE - TAU) * C( 1 , 1 ) + DOT1
241
225
*
242
- * Prepare WORK
226
+ * C(1:lastc,1) := ( 1 - tau ) * C(1:lastc,1)
243
227
*
244
- CALL DCOPY( LASTC - 1 , C( 2 , 1 ), 1 , WORK, 1 )
245
-
246
- CALL DGEMV( ' No transpose' , LASTC - 1 , LASTV - 1 , - TAU,
247
- $ C( 2 , 2 ), LDC, V( 1 + INCV ), INCV, - TAU, WORK, 1 )
228
+ CALL DSCAL( LASTC, ONE - TAU, C, 1 )
229
+ ELSE
248
230
*
249
- * Update C12
231
+ * w(1:lastc,1) := C(1:lastc,2:lastv) * v(2:lastv,1)
250
232
*
251
- CALL DAXPY( LASTV - 1 , - TAU * C( 1 , 1 ) + DOT1,
252
- $ V( 1 + INCV ), INCV, C( 1 , 2 ), LDC )
233
+ CALL DGEMV( ' No transpose ' , LASTC, LASTV - 1 , ONE,
234
+ $ C( 1 , 2 ), LDC, V( 1 + INCV ), INCV, ZERO, WORK, 1 )
253
235
*
254
- * Update C11
236
+ * w(1:lastc,1) += C(1:lastc,1) * v(1,1)
255
237
*
256
- C( 1 , 1 ) = C11
238
+ CALL DAXPY( LASTC, ONE, C, 1 , WORK, 1 )
257
239
*
258
- * Update C21
240
+ * C(1:lastc,1) := C(1:lastc,1) - tau * w(1:lastc,1)
259
241
*
260
- CALL DAXPY( LASTC - 1 , ONE, WORK, 1 , C( 2 , 1 ) , 1 )
242
+ CALL DAXPY( LASTC, - TAU, WORK, 1 , C, 1 )
261
243
*
262
- * Update C22
244
+ * C(1:lastc,2:lastv) := C(1:lastc,2:lastv) - tau * w(1:lastc,1) * v(2:lastv)**T
263
245
*
264
- CALL DGER( LASTC - 1 , LASTV - 1 , ONE , WORK, 1 ,
265
- $ V( 1 + INCV ), INCV, C( 2 , 2 ), LDC )
246
+ CALL DGER( LASTC, LASTV - 1 , - TAU , WORK, 1 , V( 1 + INCV ) ,
247
+ $ INCV, C( 1 , 2 ), LDC )
266
248
END IF
267
249
END IF
268
250
RETURN
0 commit comments