Skip to content

Commit a4698c3

Browse files
align DLARF1F versions, #1011
1 parent 0d2bff7 commit a4698c3

File tree

2 files changed

+34
-52
lines changed

2 files changed

+34
-52
lines changed

SRC/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ DLASRC = \
339339
dlaqgb.o dlaqge.o dlaqp2.o dlaqps.o dlaqp2rk.o dlaqp3rk.o dlaqsb.o dlaqsp.o dlaqsy.o \
340340
dlaqr0.o dlaqr1.o dlaqr2.o dlaqr3.o dlaqr4.o dlaqr5.o \
341341
dlaqtr.o dlar1v.o dlar2v.o iladlr.o iladlc.o \
342-
dlarf.o dlarfb.o dlarfb_gett.o dlarfg.o dlarfgp.o dlarft.o dlarfx.o dlarfy.o \
342+
dlarf.o dlarf1f.o dlarfb.o dlarfb_gett.o dlarfg.o dlarfgp.o dlarft.o dlarfx.o dlarfy.o \
343343
dlargv.o dlarmm.o dlarrv.o dlartv.o \
344344
dlarz.o dlarzb.o dlarzt.o dlaswp.o dlasy2.o \
345345
dlasyf.o dlasyf_rook.o dlasyf_rk.o \

SRC/dlarf1f.f

Lines changed: 33 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
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.
23
*
34
* =========== DOCUMENTATION ===========
45
*
@@ -35,12 +36,12 @@
3536
*>
3637
*> \verbatim
3738
*>
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
3940
*> C, from either the left or the right. H is represented in the form
4041
*>
4142
*> H = I - tau * v * v**T
4243
*>
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.
4445
*>
4546
*> If tau = 0, then H is taken to be the unit matrix.
4647
*> \endverbatim
@@ -117,7 +118,7 @@
117118
*> \author Univ. of Colorado Denver
118119
*> \author NAG Ltd.
119120
*
120-
*> \ingroup larf
121+
*> \ingroup larf1f
121122
*
122123
* =====================================================================
123124
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 )
144145
* .. Local Scalars ..
145146
LOGICAL APPLYLEFT
146147
INTEGER I, LASTV, LASTC
147-
DOUBLE PRECISION C11, DOT1, DDOT
148148
* ..
149149
* .. External Subroutines ..
150-
EXTERNAL DGEMV, DGER, DDOT, DAXPY, DCOPY, DSCAL
150+
EXTERNAL DGEMV, DGER, DAXPY
151151
* ..
152152
* .. External Functions ..
153153
LOGICAL LSAME
@@ -185,84 +185,66 @@ SUBROUTINE DLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
185185
LASTC = ILADLR(M, LASTV, C, LDC)
186186
END IF
187187
END IF
188-
189188
IF( LASTC.EQ.0 .OR. LASTV.EQ.0 ) THEN
190189
RETURN
191190
END IF
192-
193191
IF( APPLYLEFT ) THEN
194192
*
195193
* Form H * C
196194
*
197195
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
204196
*
205-
* Prepare WORK
197+
* C(1,1:lastc) := ( 1 - tau ) * C(1,1:lastc)
206198
*
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
211201
*
212-
* Update C12
202+
* w(1:lastc,1) := C(2:lastv,1:lastc)**T * v(2:lastv,1)
213203
*
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 )
215206
*
216-
* Update C21
207+
* w(1:lastc,1) += C(1,1:lastc)**T * v(1,1)
217208
*
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 )
220210
*
221-
* Update C11
211+
* C(1, 1:lastc) := C(...) - tau * w(1:lastc,1)**T
222212
*
223-
C( 1, 1 ) = C11
213+
CALL DAXPY( LASTC, -TAU, WORK, 1, C, LDC )
224214
*
225-
* Update C22
215+
* C(2:lastv,1:lastc) := C(...) - tau * v(2:lastv,1)*w(1:lastc,1)**T
226216
*
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
230220
ELSE
231221
*
232222
* Form C * H
233223
*
234224
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
241225
*
242-
* Prepare WORK
226+
* C(1:lastc,1) := ( 1 - tau ) * C(1:lastc,1)
243227
*
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
248230
*
249-
* Update C12
231+
* w(1:lastc,1) := C(1:lastc,2:lastv) * v(2:lastv,1)
250232
*
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 )
253235
*
254-
* Update C11
236+
* w(1:lastc,1) += C(1:lastc,1) * v(1,1)
255237
*
256-
C( 1, 1 ) = C11
238+
CALL DAXPY( LASTC, ONE, C, 1, WORK, 1 )
257239
*
258-
* Update C21
240+
* C(1:lastc,1) := C(1:lastc,1) - tau * w(1:lastc,1)
259241
*
260-
CALL DAXPY( LASTC - 1, ONE, WORK, 1, C( 2, 1 ), 1 )
242+
CALL DAXPY( LASTC, -TAU, WORK, 1, C, 1 )
261243
*
262-
* Update C22
244+
* C(1:lastc,2:lastv) := C(1:lastc,2:lastv) - tau * w(1:lastc,1) * v(2:lastv)**T
263245
*
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 )
266248
END IF
267249
END IF
268250
RETURN

0 commit comments

Comments
 (0)