Skip to content

Commit af491a4

Browse files
committed
fixed dlarf1f and dorm2r implementation
1 parent 4c8684d commit af491a4

File tree

3 files changed

+57
-45
lines changed

3 files changed

+57
-45
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 dlarf1.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/dlarf1.f renamed to SRC/dlarf1f.f

Lines changed: 51 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
*> \brief \b DLARF 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
*
@@ -18,7 +19,7 @@
1819
* Definition:
1920
* ===========
2021
*
21-
* SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
22+
* SUBROUTINE DLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
2223
*
2324
* .. Scalar Arguments ..
2425
* CHARACTER SIDE
@@ -120,7 +121,7 @@
120121
*> \ingroup larf
121122
*
122123
* =====================================================================
123-
SUBROUTINE DLARF1( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
124+
SUBROUTINE DLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
124125
*
125126
* -- LAPACK auxiliary routine --
126127
* -- LAPACK is a software package provided by Univ. of Tennessee, --
@@ -192,48 +193,59 @@ SUBROUTINE DLARF1( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
192193
*
193194
* Form H * C
194195
*
195-
IF( LASTV.GT.0 .AND. LASTC.GT.0) THEN
196-
*
197-
* w(1:lastc,1) := C(2:lastv,1:lastc)**T * v(2:lastv,1)
198-
*
199-
! CALL DGEMV( 'Transpose', LASTV-1, LASTC, ONE, C(1+1,1), LDC,
200-
! $ V(1+INCV), INCV, ZERO, WORK, 1 )
201-
! DO I = 1, LASTC
202-
! WORK(I) = ZERO
203-
! DO J = 2, LASTV
204-
! WORK(I) = WORK(I) + V(1 + (J-1)*INCV) * C(J,I)
205-
! END DO
206-
! END DO
207-
CALL DGEMV( 'Transpose', LASTV-1, LASTC, ONE, C(2,1), LDC,
208-
$ v(1+INCV), INCV, ZERO, WORK, 1)
209-
*
210-
* w(1:lastc,1) := w(1:lastc,1) + C(1,1:lastc)**T * v(1,1)
211-
* = w(1:lastc,1) + C(1,1:lastc)**T
212-
*
213-
! Now, do w(1:lastc,1) += C(1,1:lastc)**T
214-
! DO I = 1, LASTC
215-
! WORK(I) = WORK(I) + C(1,I)
216-
! END DO
217-
CALL DAXPY(LASTC, ONE, C, LDC, WORK, 1)
218-
*
219-
* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**T
220-
*
221-
CALL DGER( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC )
196+
IF( LASTV.GT.0 ) THEN
197+
! Check if m = 1. This means v = 1, So we just need to compute
198+
! C := HC = (1-\tau)C.
199+
IF( M.EQ.1 ) THEN
200+
CALL DSCAL(LASTC, ONE - TAU, C, LDC)
201+
ELSE
202+
*
203+
* w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1)
204+
*
205+
! w(1:lastc,1) := C(2:lastv,1:lastc)**T * v(2:lastv,1)
206+
CALL DGEMV( 'Transpose', LASTV-1, LASTC, ONE, C(1+1,1),
207+
$ LDC, V(1+INCV), INCV, ZERO, WORK, 1)
208+
! w(1:lastc,1) += C(1,1:lastc)**T * v(1,1) = C(1,1:lastc)**T
209+
CALL DAXPY(LASTC, ONE, C, LDC, WORK, 1)
210+
*
211+
* C(1:lastv,1:lastc) := C(...) - tau * v(1:lastv,1) * w(1:lastc,1)**T
212+
*
213+
! C(1, 1:lastc) := C(...) - tau * v(1,1) * w(1:lastc,1)**T
214+
! = C(...) - tau * w(1:lastc,1)**T
215+
CALL DAXPY(LASTC, -TAU, WORK, 1, C, LDC)
216+
! C(2:lastv,1:lastc) := C(...) - tau * v(2:lastv,1)*w(1:lastc,1)**T
217+
CALL DGER(LASTV-1, LASTC, -TAU, V(1+INCV), INCV, WORK, 1,
218+
$ C(1+1,1), LDC)
219+
END IF
222220
END IF
223221
ELSE
224222
*
225223
* Form C * H
226224
*
227225
IF( LASTV.GT.0 ) THEN
228-
*
229-
* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1)
230-
*
231-
CALL DGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC,
232-
$ V, INCV, ZERO, WORK, 1 )
233-
*
234-
* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**T
235-
*
236-
CALL DGER( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC )
226+
! Check if n = 1. This means v = 1, so we just need to compute
227+
! C := CH = C(1-\tau).
228+
IF( N.EQ.1 ) THEN
229+
CALL DSCAL(LASTC, ONE - TAU, C, 1)
230+
ELSE
231+
*
232+
* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1)
233+
*
234+
! w(1:lastc,1) := C(1:lastc,2:lastv) * v(2:lastv,1)
235+
CALL DGEMV( 'No transpose', LASTC, LASTV-1, ONE,
236+
$ C(1,1+1), LDC, V(1+INCV), INCV, ZERO, WORK, 1 )
237+
! w(1:lastc,1) += C(1:lastc,1) v(1,1) = C(1:lastc,1)
238+
CALL DAXPY(LASTC, ONE, C, 1, WORK, 1)
239+
*
240+
* C(1:lastc,1:lastv) := C(...) - tau * w(1:lastc,1) * v(1:lastv,1)**T
241+
*
242+
! C(1:lastc,1) := C(...) - tau * w(1:lastc,1) * v(1,1)**T
243+
! = C(...) - tau * w(1:lastc,1)
244+
CALL DAXPY(LASTC, -TAU, WORK, 1, C, 1)
245+
! C(1:lastc,2:lastv) := C(...) - tau * w(1:lastc,1) * v(2:lastv)**T
246+
CALL DGER( LASTC, LASTV-1, -TAU, WORK, 1, V(1+INCV),
247+
$ INCV, C(1,1+1), LDC )
248+
END IF
237249
END IF
238250
END IF
239251
RETURN

SRC/dorm2r.f

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ SUBROUTINE DORM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
185185
EXTERNAL LSAME
186186
* ..
187187
* .. External Subroutines ..
188-
EXTERNAL DLARF, XERBLA, DLARF1
188+
EXTERNAL XERBLA, DLARF1F
189189
* ..
190190
* .. Intrinsic Functions ..
191191
INTRINSIC MAX
@@ -266,12 +266,12 @@ SUBROUTINE DORM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
266266
*
267267
* Apply H(i)
268268
*
269-
AII = A( I, I )
270-
A( I, I ) = ONE
271-
CALL DLARF1( SIDE, MI, NI, A( I, I ), 1, TAU( I ), C( IC,
269+
! AII = A( I, I )
270+
! A( I, I ) = ONE
271+
CALL DLARF1F( SIDE, MI, NI, A( I, I ), 1, TAU( I ), C( IC,
272272
$ JC ),
273273
$ LDC, WORK )
274-
A( I, I ) = AII
274+
! A( I, I ) = AII
275275
10 CONTINUE
276276
RETURN
277277
*

0 commit comments

Comments
 (0)