diff --git a/lapack-netlib/SRC/clarf1f.c b/lapack-netlib/SRC/clarf1f.c index fdebdb670c..e20c2b3326 100644 --- a/lapack-netlib/SRC/clarf1f.c +++ b/lapack-netlib/SRC/clarf1f.c @@ -418,6 +418,10 @@ static integer c__1 = 1; --work; /* Function Body */ +/* Quick return if C is empty */ + if (*m <= 0 || *n <= 0) + return; + applyleft = lsame_(side, "L"); lastv = 1; lastc = 0; diff --git a/lapack-netlib/SRC/clarf1f.f b/lapack-netlib/SRC/clarf1f.f index b5d4e47a46..26d77dab0c 100644 --- a/lapack-netlib/SRC/clarf1f.f +++ b/lapack-netlib/SRC/clarf1f.f @@ -147,7 +147,7 @@ SUBROUTINE CLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * .. * .. Local Scalars .. LOGICAL APPLYLEFT - INTEGER I, LASTV, LASTC + INTEGER I, J, LASTV, LASTC * .. * .. External Subroutines .. EXTERNAL CAXPY, CGEMV, CGERC, CSCAL @@ -161,6 +161,11 @@ SUBROUTINE CLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) EXTERNAL LSAME, ILACLR, ILACLC * .. * .. Executable Statements .. +* +* Quick return if C is empty +* + IF( M.LE.0 .OR. N.LE.0 ) + $ RETURN * APPLYLEFT = LSAME( SIDE, 'L' ) LASTV = 1 @@ -190,6 +195,11 @@ SUBROUTINE CLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! Scan for the last non-zero row in C(:,1:lastv). LASTC = ILACLR(M, LASTV, C, LDC) END IF +! Set index for V. If INCV < 0, then I points to the end of V. +! For INCV > 0, set I to point to V(2) + IF( INCV.GT.0 ) THEN + I = 1 + INCV + END IF END IF IF( LASTC.EQ.0 ) THEN RETURN @@ -208,24 +218,24 @@ SUBROUTINE CLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * w(1:lastc,1) := C(2:lastv,1:lastc)**H * v(2:lastv,1) * CALL CGEMV( 'Conjugate transpose', LASTV - 1, LASTC, ONE, - $ C( 2, 1 ), LDC, V( 1 + INCV ), INCV, ZERO, + $ C( 2, 1 ), LDC, V( I ), INCV, ZERO, $ WORK, 1 ) * * w(1:lastc,1) += v(1,1) * C(1,1:lastc)**H * - DO I = 1, LASTC - WORK( I ) = WORK( I ) + CONJG( C( 1, I ) ) + DO J = 1, LASTC + WORK( J ) = WORK( J ) + CONJG( C( 1, J ) ) END DO * * C(1, 1:lastc) += - tau * v(1,1) * w(1:lastc,1)**H * - DO I = 1, LASTC - C( 1, I ) = C( 1, I ) - TAU * CONJG( WORK( I ) ) + DO J = 1, LASTC + C( 1, J ) = C( 1, J ) - TAU * CONJG( WORK( J ) ) END DO * * C(2:lastv,1:lastc) += - tau * v(2:lastv,1) * w(1:lastc,1)**H * - CALL CGERC( LASTV - 1, LASTC, -TAU, V( 1 + INCV ), INCV, + CALL CGERC( LASTV - 1, LASTC, -TAU, V( I ), INCV, $ WORK, 1, C( 2, 1 ), LDC ) END IF ELSE @@ -242,7 +252,7 @@ SUBROUTINE CLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * w(1:lastc,1) := C(1:lastc,2:lastv) * v(2:lastv,1) * CALL CGEMV( 'No transpose', LASTC, LASTV - 1, ONE, - $ C( 1, 2 ), LDC, V( 1 + INCV ), INCV, ZERO, + $ C( 1, 2 ), LDC, V( I ), INCV, ZERO, $ WORK, 1 ) * * w(1:lastc,1) += v(1,1) * C(1:lastc,1) @@ -256,7 +266,7 @@ SUBROUTINE CLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * C(1:lastc,2:lastv) += - tau * w(1:lastc,1) * v(2:lastv)**H * CALL CGERC( LASTC, LASTV - 1, -TAU, WORK, 1, - $ V( 1 + INCV ), INCV, C( 1, 2 ), LDC ) + $ V( I ), INCV, C( 1, 2 ), LDC ) END IF END IF RETURN diff --git a/lapack-netlib/SRC/clarf1l.c b/lapack-netlib/SRC/clarf1l.c index 6817689bef..b09874b0ce 100644 --- a/lapack-netlib/SRC/clarf1l.c +++ b/lapack-netlib/SRC/clarf1l.c @@ -420,6 +420,10 @@ static integer c__1 = 1; --work; /* Function Body */ +/* Quick return if C is empty */ + if (*m <= 0 || *n <= 0) + return; + applyleft = lsame_(side, "L"); firstv = 1; lastc = 0; diff --git a/lapack-netlib/SRC/clarf1l.f b/lapack-netlib/SRC/clarf1l.f index a592255f16..40ef61cb97 100644 --- a/lapack-netlib/SRC/clarf1l.f +++ b/lapack-netlib/SRC/clarf1l.f @@ -162,6 +162,11 @@ SUBROUTINE CLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) EXTERNAL LSAME, ILACLR, ILACLC * .. * .. Executable Statements .. +* +* Quick return if C is empty +* + IF( M.LE.0 .OR. N.LE.0 ) + $ RETURN * APPLYLEFT = LSAME( SIDE, 'L' ) FIRSTV = 1 @@ -174,7 +179,11 @@ SUBROUTINE CLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ELSE LASTV = N END IF - I = 1 + IF( INCV.GT.0 ) THEN + I = 1 + ELSE + I = 1 - (LASTV-1) * INCV + END IF ! Look for the last non-zero row in V. DO WHILE( LASTV.GT.FIRSTV .AND. V( I ).EQ.ZERO ) FIRSTV = FIRSTV + 1 @@ -187,6 +196,11 @@ SUBROUTINE CLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! Scan for the last non-zero row in C(:,1:lastv). LASTC = ILACLR(M, LASTV, C, LDC) END IF +! Set index for V. If INCV > 0, then I points to the start of V. +! For INCV < 0, set I to point to V(M-1) + IF( INCV.LT.0 ) THEN + I = 1 - INCV + END IF END IF IF( LASTC.EQ.0 ) THEN RETURN diff --git a/lapack-netlib/SRC/dlarf1f.c b/lapack-netlib/SRC/dlarf1f.c index c36057d6dd..a1dc631064 100644 --- a/lapack-netlib/SRC/dlarf1f.c +++ b/lapack-netlib/SRC/dlarf1f.c @@ -413,6 +413,10 @@ static integer c__1 = 1; --work; /* Function Body */ + /* Quick return if C is empty */ + if (*m <= 0 || *n <= 0) + return; + applyleft = lsame_(side, "L"); lastv = 1; lastc = 0; diff --git a/lapack-netlib/SRC/dlarf1f.f b/lapack-netlib/SRC/dlarf1f.f index c65035c61f..e008e99627 100644 --- a/lapack-netlib/SRC/dlarf1f.f +++ b/lapack-netlib/SRC/dlarf1f.f @@ -188,6 +188,11 @@ SUBROUTINE DLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) EXTERNAL LSAME, ILADLR, ILADLC * .. * .. Executable Statements .. +* +* Quick return if C is empty +* + IF( M.LE.0 .OR. N.LE.0 ) + $ RETURN * APPLYLEFT = LSAME( SIDE, 'L' ) LASTV = 1 @@ -219,6 +224,11 @@ SUBROUTINE DLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! Scan for the last non-zero row in C(:,1:lastv). LASTC = ILADLR(M, LASTV, C, LDC) END IF +! Set index for V. If INCV < 0, then I points to the end of V. +! For INCV > 0, set I to point to V(2) + IF( INCV.GT.0 ) THEN + I = 1 + INCV + END IF END IF IF( LASTC.EQ.0 ) THEN RETURN @@ -240,7 +250,7 @@ SUBROUTINE DLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * ! w(1:lastc,1) := C(2:lastv,1:lastc)**T * v(2:lastv,1) CALL DGEMV( 'Transpose', LASTV-1, LASTC, ONE, C(1+1,1), - $ LDC, V(1+INCV), INCV, ZERO, WORK, 1) + $ LDC, V(I), INCV, ZERO, WORK, 1) ! w(1:lastc,1) += C(1,1:lastc)**T * v(1,1) = C(1,1:lastc)**T CALL DAXPY(LASTC, ONE, C, LDC, WORK, 1) * @@ -250,7 +260,7 @@ SUBROUTINE DLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! = C(...) - tau * w(1:lastc,1)**T CALL DAXPY(LASTC, -TAU, WORK, 1, C, LDC) ! C(2:lastv,1:lastc) := C(...) - tau * v(2:lastv,1)*w(1:lastc,1)**T - CALL DGER(LASTV-1, LASTC, -TAU, V(1+INCV), INCV, WORK, 1, + CALL DGER(LASTV-1, LASTC, -TAU, V(I), INCV, WORK, 1, $ C(1+1,1), LDC) END IF ELSE @@ -270,7 +280,7 @@ SUBROUTINE DLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * ! w(1:lastc,1) := C(1:lastc,2:lastv) * v(2:lastv,1) CALL DGEMV( 'No transpose', LASTC, LASTV-1, ONE, - $ C(1,1+1), LDC, V(1+INCV), INCV, ZERO, WORK, 1 ) + $ C(1,1+1), LDC, V(I), INCV, ZERO, WORK, 1 ) ! w(1:lastc,1) += C(1:lastc,1) v(1,1) = C(1:lastc,1) CALL DAXPY(LASTC, ONE, C, 1, WORK, 1) * @@ -280,7 +290,7 @@ SUBROUTINE DLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! = C(...) - tau * w(1:lastc,1) CALL DAXPY(LASTC, -TAU, WORK, 1, C, 1) ! C(1:lastc,2:lastv) := C(...) - tau * w(1:lastc,1) * v(2:lastv)**T - CALL DGER( LASTC, LASTV-1, -TAU, WORK, 1, V(1+INCV), + CALL DGER( LASTC, LASTV-1, -TAU, WORK, 1, V(I), $ INCV, C(1,1+1), LDC ) END IF END IF diff --git a/lapack-netlib/SRC/dlarf1l.c b/lapack-netlib/SRC/dlarf1l.c index 5771f5090b..1a34a65f8a 100644 --- a/lapack-netlib/SRC/dlarf1l.c +++ b/lapack-netlib/SRC/dlarf1l.c @@ -381,6 +381,10 @@ static integer c__1 = 1; --work; /* Function Body */ +/* Quick return if C is empty */ + if (*m <= 0 || *n <= 0) + return; + applyleft = lsame_(side, "L"); firstv = 1; lastc = 0; diff --git a/lapack-netlib/SRC/dlarf1l.f b/lapack-netlib/SRC/dlarf1l.f index d225701fcd..01077a4dd7 100644 --- a/lapack-netlib/SRC/dlarf1l.f +++ b/lapack-netlib/SRC/dlarf1l.f @@ -1,5 +1,5 @@ *> \brief \b DLARF1L applies an elementary reflector to a general rectangular -* matrix assuming v(lastv) = 1 where lastv is the last non-zero +* matrix assuming v(lastv) = 1, where lastv is the last non-zero * element * * =========== DOCUMENTATION =========== @@ -40,7 +40,8 @@ *> *> H = I - tau * v * v**T *> -*> where tau is a real scalar and v is a real vector. +*> where tau is a real scalar and v is a real vector assuming v(lastv) = 1, +*> where lastv is the last non-zero element. *> *> If tau = 0, then H is taken to be the unit matrix. *> \endverbatim @@ -79,7 +80,7 @@ *> \param[in] INCV *> \verbatim *> INCV is INTEGER -*> The increment between elements of v. INCV <> 0. +*> The increment between elements of v. INCV > 0. *> \endverbatim *> *> \param[in] TAU @@ -117,7 +118,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup larf +*> \ingroup larf1l * * ===================================================================== SUBROUTINE DLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) @@ -144,10 +145,10 @@ SUBROUTINE DLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * .. * .. Local Scalars .. LOGICAL APPLYLEFT - INTEGER I, FIRSTV, LASTV, LASTC + INTEGER I, LASTV, LASTC, FIRSTV * .. * .. External Subroutines .. - EXTERNAL DAXPY, DGEMV, DGER, DSCAL + EXTERNAL DGEMV, DGER, DAXPY, DSCAL * .. * .. External Functions .. LOGICAL LSAME @@ -155,19 +156,28 @@ SUBROUTINE DLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) EXTERNAL LSAME, ILADLR, ILADLC * .. * .. Executable Statements .. +* +* Quick return if C is empty +* + IF( M.LE.0 .OR. N.LE.0 ) + $ RETURN * APPLYLEFT = LSAME( SIDE, 'L' ) FIRSTV = 1 LASTC = 0 IF( TAU.NE.ZERO ) THEN ! Set up variables for scanning V. LASTV begins pointing to the end -! of V. +! of V up to V(1). IF( APPLYLEFT ) THEN LASTV = M ELSE LASTV = N END IF - I = 1 + IF( INCV.GT.0 ) THEN + I = 1 + ELSE + I = 1 - (LASTV-1) * INCV + END IF ! Look for the last non-zero row in V. DO WHILE( LASTV.GT.FIRSTV .AND. V( I ).EQ.ZERO ) FIRSTV = FIRSTV + 1 @@ -180,6 +190,11 @@ SUBROUTINE DLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! Scan for the last non-zero row in C(:,1:lastv). LASTC = ILADLR(M, LASTV, C, LDC) END IF +! Set index for V. If INCV > 0, then I points to the start of V. +! For INCV < 0, set I to point to V(M-1) + IF( INCV.LT.0 ) THEN + I = 1 - INCV + END IF END IF IF( LASTC.EQ.0 ) THEN RETURN @@ -188,60 +203,61 @@ SUBROUTINE DLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * * Form H * C * - IF( LASTV.GT.0 ) THEN - ! Check if m = 1. This means v = 1, So we just need to compute - ! C := HC = (1-\tau)C. - IF( LASTV.EQ.FIRSTV ) THEN - CALL DSCAL(LASTC, ONE - TAU, C( FIRSTV, 1), LDC) - ELSE -* -* w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1) -* - ! w(1:lastc,1) := C(1:lastv-1,1:lastc)**T * v(1:lastv-1,1) - CALL DGEMV( 'Transpose', LASTV-FIRSTV, LASTC, ONE, - $ C(FIRSTV,1), LDC, V(I), INCV, ZERO, - $ WORK, 1) - ! w(1:lastc,1) += C(lastv,1:lastc)**T * v(lastv,1) = C(lastv,1:lastc)**T - CALL DAXPY(LASTC, ONE, C(LASTV,1), LDC, WORK, 1) -* -* C(1:lastv,1:lastc) := C(...) - tau * v(1:lastv,1) * w(1:lastc,1)**T -* - ! C(lastv, 1:lastc) := C(...) - tau * v(lastv,1) * w(1:lastc,1)**T - ! = C(...) - tau * w(1:lastc,1)**T - CALL DAXPY(LASTC, -TAU, WORK, 1, C(LASTV,1), LDC) - ! C(1:lastv-1,1:lastc) := C(...) - tau * v(1:lastv-1,1)*w(1:lastc,1)**T - CALL DGER(LASTV-FIRSTV, LASTC, -TAU, V(I), INCV, - $ WORK, 1, C(FIRSTV,1), LDC) - END IF + IF( LASTV.EQ.FIRSTV ) THEN +* +* C(lastv,1:lastc) := ( 1 - tau ) * C(lastv,1:lastc) +* + CALL DSCAL( LASTC, ONE - TAU, C( LASTV, 1 ), LDC ) + ELSE +* +* w(1:lastc,1) := C(firstv:lastv-1,1:lastc)**T * v(firstv:lastv-1,1) +* + CALL DGEMV( 'Transpose', LASTV - FIRSTV, LASTC, ONE, + $ C( FIRSTV, 1 ), LDC, V( I ), INCV, ZERO, + $ WORK, 1 ) +* +* w(1:lastc,1) += C(lastv,1:lastc)**T * v(lastv,1) +* + CALL DAXPY( LASTC, ONE, C( LASTV, 1 ), LDC, WORK, 1 ) +* +* C(lastv,1:lastc) += - tau * v(lastv,1) * w(1:lastc,1)**T +* + CALL DAXPY( LASTC, -TAU, WORK, 1, C( LASTV, 1 ), LDC ) +* +* C(firstv:lastv-1,1:lastc) += - tau * v(firstv:lastv-1,1) * w(1:lastc,1)**T +* + CALL DGER( LASTV - FIRSTV, LASTC, -TAU, V( I ), INCV, + $ WORK, 1, C( FIRSTV, 1 ), LDC) END IF ELSE * * Form C * H * - IF( LASTV.GT.0 ) THEN - ! Check if n = 1. This means v = 1, so we just need to compute - ! C := CH = C(1-\tau). - IF( LASTV.EQ.FIRSTV ) THEN - CALL DSCAL(LASTC, ONE - TAU, C, 1) - ELSE -* -* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) -* - ! w(1:lastc,1) := C(1:lastc,1:lastv-1) * v(1:lastv-1,1) - CALL DGEMV( 'No transpose', LASTC, LASTV-FIRSTV, - $ ONE, C(1,FIRSTV), LDC, V(I), INCV, ZERO, WORK, 1 ) - ! w(1:lastc,1) += C(1:lastc,lastv) * v(lastv,1) = C(1:lastc,lastv) - CALL DAXPY(LASTC, ONE, C(1,LASTV), 1, WORK, 1) -* -* C(1:lastc,1:lastv) := C(...) - tau * w(1:lastc,1) * v(1:lastv,1)**T -* - ! C(1:lastc,lastv) := C(...) - tau * w(1:lastc,1) * v(lastv,1)**T - ! = C(...) - tau * w(1:lastc,1) - CALL DAXPY(LASTC, -TAU, WORK, 1, C(1,LASTV), 1) - ! C(1:lastc,1:lastv-1) := C(...) - tau * w(1:lastc,1) * v(1:lastv-1)**T - CALL DGER( LASTC, LASTV-FIRSTV, -TAU, WORK, 1, V(I), - $ INCV, C(1,FIRSTV), LDC ) - END IF + IF( LASTV.EQ.FIRSTV ) THEN +* +* C(1:lastc,lastv) := ( 1 - tau ) * C(1:lastc,lastv) +* + CALL DSCAL( LASTC, ONE - TAU, C( 1, LASTV ), 1 ) + ELSE +* +* w(1:lastc,1) := C(1:lastc,firstv:lastv-1) * v(firstv:lastv-1,1) +* + CALL DGEMV( 'No transpose', LASTC, LASTV - FIRSTV, ONE, + $ C( 1, FIRSTV ), LDC, V( I ), INCV, ZERO, + $ WORK, 1 ) +* +* w(1:lastc,1) += C(1:lastc,lastv) * v(lastv,1) +* + CALL DAXPY( LASTC, ONE, C( 1, LASTV ), 1, WORK, 1 ) +* +* C(1:lastc,lastv) += - tau * v(lastv,1) * w(1:lastc,1) +* + CALL DAXPY( LASTC, -TAU, WORK, 1, C( 1, LASTV ), 1 ) +* +* C(1:lastc,firstv:lastv-1) += - tau * w(1:lastc,1) * v(firstv:lastv-1)**T +* + CALL DGER( LASTC, LASTV - FIRSTV, -TAU, WORK, 1, V( I ), + $ INCV, C( 1, FIRSTV ), LDC ) END IF END IF RETURN diff --git a/lapack-netlib/SRC/slarf1f.c b/lapack-netlib/SRC/slarf1f.c index e44a4d7e63..58e44946a4 100644 --- a/lapack-netlib/SRC/slarf1f.c +++ b/lapack-netlib/SRC/slarf1f.c @@ -385,6 +385,10 @@ static integer c__1 = 1; --work; /* Function Body */ +/* Quick return if C is empty */ + if (*m <= 0 || *n <= 0) + return; + applyleft = lsame_(side, "L"); lastv = 1; lastc = 0; diff --git a/lapack-netlib/SRC/slarf1f.f b/lapack-netlib/SRC/slarf1f.f index d0c015eacf..e87a515a11 100644 --- a/lapack-netlib/SRC/slarf1f.f +++ b/lapack-netlib/SRC/slarf1f.f @@ -154,6 +154,11 @@ SUBROUTINE SLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) EXTERNAL LSAME, ILASLR, ILASLC * .. * .. Executable Statements .. +* +* Quick return if C is empty +* + IF( M.LE.0 .OR. N.LE.0 ) + $ RETURN * APPLYLEFT = LSAME( SIDE, 'L' ) LASTV = 1 @@ -183,6 +188,11 @@ SUBROUTINE SLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! Scan for the last non-zero row in C(:,1:lastv). LASTC = ILASLR(M, LASTV, C, LDC) END IF +! Set index for V. If INCV < 0, then I points to the end of V. +! For INCV > 0, set I to point to V(2) + IF( INCV.GT.0 ) THEN + I = 1 + INCV + END IF END IF IF( LASTC.EQ.0 ) THEN RETURN @@ -201,7 +211,7 @@ SUBROUTINE SLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * w(1:lastc,1) := C(2:lastv,1:lastc)**T * v(2:lastv,1) * CALL SGEMV( 'Transpose', LASTV - 1, LASTC, ONE, C( 2, 1 ), - $ LDC, V( 1 + INCV ), INCV, ZERO, WORK, 1 ) + $ LDC, V( I ), INCV, ZERO, WORK, 1 ) * * w(1:lastc,1) += v(1,1) * C(1,1:lastc)**T * @@ -213,7 +223,7 @@ SUBROUTINE SLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * * C(2:lastv,1:lastc) += - tau * v(2:lastv,1) * w(1:lastc,1)**T * - CALL SGER( LASTV - 1, LASTC, -TAU, V( 1 + INCV ), INCV, + CALL SGER( LASTV - 1, LASTC, -TAU, V( I ), INCV, $ WORK, 1, C( 2, 1 ), LDC ) END IF ELSE @@ -230,7 +240,7 @@ SUBROUTINE SLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * w(1:lastc,1) := C(1:lastc,2:lastv) * v(2:lastv,1) * CALL SGEMV( 'No transpose', LASTC, LASTV - 1, ONE, - $ C( 1, 2 ), LDC, V( 1 + INCV ), INCV, ZERO, + $ C( 1, 2 ), LDC, V( I ), INCV, ZERO, $ WORK, 1 ) * * w(1:lastc,1) += v(1,1) * C(1:lastc,1) @@ -244,7 +254,7 @@ SUBROUTINE SLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * C(1:lastc,2:lastv) += - tau * w(1:lastc,1) * v(2:lastv)**T * CALL SGER( LASTC, LASTV - 1, -TAU, WORK, 1, - $ V( 1 + INCV ), INCV, C( 1, 2 ), LDC ) + $ V( I ), INCV, C( 1, 2 ), LDC ) END IF END IF RETURN diff --git a/lapack-netlib/SRC/slarf1l.c b/lapack-netlib/SRC/slarf1l.c index b2463c00bf..4caa8e3e13 100644 --- a/lapack-netlib/SRC/slarf1l.c +++ b/lapack-netlib/SRC/slarf1l.c @@ -389,6 +389,10 @@ static integer c__1 = 1; --work; /* Function Body */ +/* Quick return if C is empty */ + if (*m <= 0 || *n <= 0) + return; + applyleft = lsame_(side, "L"); firstv = 1; lastc = 0; diff --git a/lapack-netlib/SRC/slarf1l.f b/lapack-netlib/SRC/slarf1l.f index d4fbb60108..e02f6946d8 100644 --- a/lapack-netlib/SRC/slarf1l.f +++ b/lapack-netlib/SRC/slarf1l.f @@ -156,6 +156,11 @@ SUBROUTINE SLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) EXTERNAL LSAME, ILASLR, ILASLC * .. * .. Executable Statements .. +* +* Quick return if C is empty +* + IF( M.LE.0 .OR. N.LE.0 ) + $ RETURN * APPLYLEFT = LSAME( SIDE, 'L' ) FIRSTV = 1 @@ -168,7 +173,11 @@ SUBROUTINE SLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ELSE LASTV = N END IF - I = 1 + IF( INCV.GT.0 ) THEN + I = 1 + ELSE + I = 1 - (LASTV-1) * INCV + END IF ! Look for the last non-zero row in V. DO WHILE( LASTV.GT.FIRSTV .AND. V( I ).EQ.ZERO ) FIRSTV = FIRSTV + 1 @@ -181,6 +190,11 @@ SUBROUTINE SLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! Scan for the last non-zero row in C(:,1:lastv). LASTC = ILASLR(M, LASTV, C, LDC) END IF +! Set index for V. If INCV > 0, then I points to the start of V. +! For INCV < 0, set I to point to V(M-1) + IF( INCV.LT.0 ) THEN + I = 1 - INCV + END IF END IF IF( LASTC.EQ.0 ) THEN RETURN diff --git a/lapack-netlib/SRC/zlarf1f.c b/lapack-netlib/SRC/zlarf1f.c index 57f4557d7b..2d2cbd5b86 100644 --- a/lapack-netlib/SRC/zlarf1f.c +++ b/lapack-netlib/SRC/zlarf1f.c @@ -441,6 +441,10 @@ static integer c__1 = 1; --work; /* Function Body */ +/* Quick return if C is empty */ + if (*m <= 0 || *n <= 0) + return; + applyleft = lsame_(side, "L"); lastv = 1; lastc = 0; diff --git a/lapack-netlib/SRC/zlarf1f.f b/lapack-netlib/SRC/zlarf1f.f index adaca3c9b4..d840c1db91 100644 --- a/lapack-netlib/SRC/zlarf1f.f +++ b/lapack-netlib/SRC/zlarf1f.f @@ -191,6 +191,11 @@ SUBROUTINE ZLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) EXTERNAL LSAME, ILAZLR, ILAZLC * .. * .. Executable Statements .. +* +* Quick return if C is empty +* + IF( M.LE.0 .OR. N.LE.0 ) + $ RETURN * APPLYLEFT = LSAME( SIDE, 'L' ) LASTV = 1 @@ -222,6 +227,11 @@ SUBROUTINE ZLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! Scan for the last non-zero row in C(:,1:lastv). LASTC = ILAZLR(M, LASTV, C, LDC) END IF +! Set index for V. If INCV < 0, then I points to the end of V. +! For INCV > 0, set I to point to V(2) + IF( INCV.GT.0 ) THEN + I = 1 + INCV + END IF END IF IF( LASTC.EQ.0 ) THEN RETURN @@ -244,13 +254,13 @@ SUBROUTINE ZLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! w = C_1**H + C_2**Hv_2 ! w = C_2**Hv_2 CALL ZGEMV( 'Conjugate transpose', LASTV - 1, - $ LASTC, ONE, C( 1+1, 1 ), LDC, V( 1 + INCV ), + $ LASTC, ONE, C( 1+1, 1 ), LDC, V( I ), $ INCV, ZERO, WORK, 1 ) * * w(1:lastc,1) += v(1,1) * C(1,1:lastc)**H * - DO I = 1, LASTC - WORK( I ) = WORK( I ) + DCONJG( C( 1, I ) ) + DO J = 1, LASTC + WORK( J ) = WORK( J ) + DCONJG( C( 1, J ) ) END DO * * C(1:lastv,1:lastc) := C(...) - tau * v(1:lastv,1) * w(1:lastc,1)**H @@ -258,13 +268,13 @@ SUBROUTINE ZLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! C(1, 1:lastc) := C(...) - tau * v(1,1) * w(1:lastc,1)**H ! = C(...) - tau * Conj(w(1:lastc,1)) ! This is essentially a zaxpyc - DO I = 1, LASTC - C( 1, I ) = C( 1, I ) - TAU * DCONJG( WORK( I ) ) + DO J = 1, LASTC + C( 1, J ) = C( 1, J ) - TAU * DCONJG( WORK( J ) ) END DO * * C(2:lastv,1:lastc) += - tau * v(2:lastv,1) * w(1:lastc,1)**H * - CALL ZGERC( LASTV - 1, LASTC, -TAU, V( 1 + INCV ), + CALL ZGERC( LASTV - 1, LASTC, -TAU, V( I ), $ INCV, WORK, 1, C( 1+1, 1 ), LDC ) END IF ELSE @@ -281,7 +291,7 @@ SUBROUTINE ZLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) * ! w(1:lastc,1) := C(1:lastc,2:lastv) * v(2:lastv,1) CALL ZGEMV( 'No transpose', LASTC, LASTV-1, ONE, - $ C(1,1+1), LDC, V(1+INCV), INCV, ZERO, WORK, 1 ) + $ C(1,1+1), LDC, V(I), INCV, ZERO, WORK, 1 ) ! w(1:lastc,1) += C(1:lastc,1) v(1,1) = C(1:lastc,1) CALL ZAXPY(LASTC, ONE, C, 1, WORK, 1) * @@ -291,7 +301,7 @@ SUBROUTINE ZLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! = C(...) - tau * w(1:lastc,1) CALL ZAXPY(LASTC, -TAU, WORK, 1, C, 1) ! C(1:lastc,2:lastv) := C(...) - tau * w(1:lastc,1) * v(2:lastv)**T - CALL ZGERC( LASTC, LASTV-1, -TAU, WORK, 1, V(1+INCV), + CALL ZGERC( LASTC, LASTV-1, -TAU, WORK, 1, V(I), $ INCV, C(1,1+1), LDC ) END IF END IF diff --git a/lapack-netlib/SRC/zlarf1l.c b/lapack-netlib/SRC/zlarf1l.c index bd71f60abd..a1c36434bd 100644 --- a/lapack-netlib/SRC/zlarf1l.c +++ b/lapack-netlib/SRC/zlarf1l.c @@ -415,6 +415,10 @@ static integer c__1 = 1; --work; /* Function Body */ +/* Quick return if C is empty */ + if (*m <= 0 || *n <= 0) + return; + applyleft = lsame_(side, "L"); firstv = 1; lastc = 0; diff --git a/lapack-netlib/SRC/zlarf1l.f b/lapack-netlib/SRC/zlarf1l.f index 2a3bd1d373..67afccfc74 100644 --- a/lapack-netlib/SRC/zlarf1l.f +++ b/lapack-netlib/SRC/zlarf1l.f @@ -165,6 +165,11 @@ SUBROUTINE ZLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) EXTERNAL LSAME, ILAZLR, ILAZLC * .. * .. Executable Statements .. +* +* Quick return if C is empty +* + IF( M.LE.0 .OR. N.LE.0 ) + $ RETURN * APPLYLEFT = LSAME( SIDE, 'L' ) FIRSTV = 1 @@ -177,7 +182,11 @@ SUBROUTINE ZLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ELSE LASTV = N END IF - I = 1 + IF( INCV.GT.0 ) THEN + I = 1 + ELSE + I = 1 - (LASTV-1) * INCV + END IF ! Look for the last non-zero row in V. DO WHILE( LASTV.GT.FIRSTV .AND. V( I ).EQ.ZERO ) FIRSTV = FIRSTV + 1 @@ -190,6 +199,11 @@ SUBROUTINE ZLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) ! Scan for the last non-zero row in C(:,1:lastv). LASTC = ILAZLR(M, LASTV, C, LDC) END IF +! Set index for V. If INCV > 0, then I points to the start of V. +! For INCV < 0, set I to point to V(M-1) + IF( INCV.LT.0 ) THEN + I = 1 - INCV + END IF END IF IF( LASTC.EQ.0 ) THEN RETURN