From ejr@cs.berkeley.edu Mon Mar 23 15:54:21 2009 Date: Mon, 23 Mar 2009 15:46:14 -0600 From: Jason Riedy To: Sven Hammarling , Yozo Hida , "daniel.kressner@sam.math.ethz.ch" , Julie Langou , "Langou, Julien" Cc: Jason Riedy Subject: [PATCH 1/2] New routines: ILAxLV, scan a vector for trailing zeros The Householder rotation *generating* routines can benefit from not working on trailing zeros. This doesn't save anything asymptotically for low-profile matrices, but it can save a little on the constant. Signed-off-by: Jason Riedy --- SRC/Makefile | 8 ++++---- SRC/ilaclv.f | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SRC/iladlv.f | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SRC/ilaslv.f | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SRC/ilazlv.f | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 232 insertions(+), 4 deletions(-) create mode 100644 SRC/ilaclv.f create mode 100644 SRC/iladlv.f create mode 100644 SRC/ilaslv.f create mode 100644 SRC/ilazlv.f diff --git a/SRC/Makefile b/SRC/Makefile index d610f14..e855ace 100644 --- a/SRC/Makefile +++ b/SRC/Makefile @@ -109,7 +109,7 @@ SLASRC = \ slapll.o slapmt.o \ slaqgb.o slaqge.o slaqp2.o slaqps.o slaqsb.o slaqsp.o slaqsy.o \ slaqr0.o slaqr1.o slaqr2.o slaqr3.o slaqr4.o slaqr5.o \ - slaqtr.o slar1v.o slar2v.o ilaslr.o ilaslc.o \ + slaqtr.o slar1v.o slar2v.o ilaslr.o ilaslc.o ilaslv.o \ slarf.o slarfb.o slarfg.o slarft.o slarfx.o slargv.o \ slarrv.o slartv.o slarfp.o \ slarz.o slarzb.o slarzt.o slaswp.o slasy2.o slasyf.o \ @@ -181,7 +181,7 @@ CLASRC = \ clantp.o clantr.o clapll.o clapmt.o clarcm.o claqgb.o claqge.o \ claqhb.o claqhe.o claqhp.o claqp2.o claqps.o claqsb.o \ claqr0.o claqr1.o claqr2.o claqr3.o claqr4.o claqr5.o \ - claqsp.o claqsy.o clar1v.o clar2v.o ilaclr.o ilaclc.o \ + claqsp.o claqsy.o clar1v.o clar2v.o ilaclr.o ilaclc.o ilaclv.o \ clarf.o clarfb.o clarfg.o clarft.o clarfp.o \ clarfx.o clargv.o clarnv.o clarrv.o clartg.o clartv.o \ clarz.o clarzb.o clarzt.o clascl.o claset.o clasr.o classq.o \ @@ -241,7 +241,7 @@ DLASRC = \ dlapll.o dlapmt.o \ dlaqgb.o dlaqge.o dlaqp2.o dlaqps.o dlaqsb.o dlaqsp.o dlaqsy.o \ dlaqr0.o dlaqr1.o dlaqr2.o dlaqr3.o dlaqr4.o dlaqr5.o \ - dlaqtr.o dlar1v.o dlar2v.o iladlr.o iladlc.o \ + dlaqtr.o dlar1v.o dlar2v.o iladlr.o iladlc.o iladlv.o \ dlarf.o dlarfb.o dlarfg.o dlarft.o dlarfx.o dlargv.o \ dlarrv.o dlartv.o dlarfp.o \ dlarz.o dlarzb.o dlarzt.o dlaswp.o dlasy2.o dlasyf.o \ @@ -316,7 +316,7 @@ ZLASRC = \ zlantp.o zlantr.o zlapll.o zlapmt.o zlaqgb.o zlaqge.o \ zlaqhb.o zlaqhe.o zlaqhp.o zlaqp2.o zlaqps.o zlaqsb.o \ zlaqr0.o zlaqr1.o zlaqr2.o zlaqr3.o zlaqr4.o zlaqr5.o \ - zlaqsp.o zlaqsy.o zlar1v.o zlar2v.o ilazlr.o ilazlc.o \ + zlaqsp.o zlaqsy.o zlar1v.o zlar2v.o ilazlr.o ilazlc.o ilazlv.o \ zlarcm.o zlarf.o zlarfb.o \ zlarfg.o zlarft.o zlarfp.o \ zlarfx.o zlargv.o zlarnv.o zlarrv.o zlartg.o zlartv.o \ diff --git a/SRC/ilaclv.f b/SRC/ilaclv.f new file mode 100644 index 0000000..46f5077 --- /dev/null +++ b/SRC/ilaclv.f @@ -0,0 +1,57 @@ + INTEGER FUNCTION ILACLV(N, X, INCX) + IMPLICIT NONE +* +* -- LAPACK auxiliary routine (version 3.2) -- +* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. +* December 2007 +* +* .. Scalar Arguments .. + INTEGER N, INCX +* .. +* .. Array Arguments .. + COMPLEX X( * ) +* .. +* +* Purpose +* ======= +* +* ILACLV scans a vector X for its last non-zero entry. Returns 0 if +* all entries are zero. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The number of entries to check in X. +* +* X (input) COMPLEX array, dimension (1+(N-2)*abs(INCX)) +* The vector X. +* +* INCX (input) INTEGER +* The increment between elements of X. INCX > 0. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX ZERO + PARAMETER ( ZERO = (0.0E+0, 0.0E+0) ) +* .. +* .. Local Scalars .. + INTEGER I +* .. +* .. Executable Statements .. +* +* Quick test for the common case where the last entry is non-zero. + IF( N.EQ.0 ) THEN + ILACLV = N + ELSE IF( X( 1 + (N-1)*INCX ).NE.ZERO ) THEN + ILACLV = N + ELSE +* Scan back from the end of the vector. + DO I = N, 1, -1 + IF( X( 1 + (I-1)*INCX ).NE.ZERO ) EXIT + END DO + ILACLV = I + END IF + RETURN + END FUNCTION diff --git a/SRC/iladlv.f b/SRC/iladlv.f new file mode 100644 index 0000000..40bde5e --- /dev/null +++ b/SRC/iladlv.f @@ -0,0 +1,57 @@ + INTEGER FUNCTION ILADLV(N, X, INCX) + IMPLICIT NONE +* +* -- LAPACK auxiliary routine (version 3.2) -- +* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. +* December 2007 +* +* .. Scalar Arguments .. + INTEGER N, INCX +* .. +* .. Array Arguments .. + DOUBLE PRECISION X( * ) +* .. +* +* Purpose +* ======= +* +* ILADLV scans a vector X for its last non-zero entry. Returns 0 if +* all entries are zero. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The number of entries to check in X. +* +* X (input) DOUBLE PRECISION array, dimension (1+(N-2)*abs(INCX)) +* The vector X. +* +* INCX (input) INTEGER +* The increment between elements of X. INCX > 0. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER ( ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + INTEGER I +* .. +* .. Executable Statements .. +* +* Quick test for the common case where the last entry is non-zero. + IF( N.EQ.0 ) THEN + ILADLV = N + ELSE IF( X( 1 + (N-1)*INCX ).NE.ZERO ) THEN + ILADLV = N + ELSE +* Scan back from the end of the vector. + DO I = N, 1, -1 + IF( X( 1 + (I-1)*INCX ).NE.ZERO ) EXIT + END DO + ILADLV = I + END IF + RETURN + END FUNCTION diff --git a/SRC/ilaslv.f b/SRC/ilaslv.f new file mode 100644 index 0000000..291bf22 --- /dev/null +++ b/SRC/ilaslv.f @@ -0,0 +1,57 @@ + INTEGER FUNCTION ILASLV(N, X, INCX) + IMPLICIT NONE +* +* -- LAPACK auxiliary routine (version 3.2) -- +* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. +* December 2007 +* +* .. Scalar Arguments .. + INTEGER N, INCX +* .. +* .. Array Arguments .. + REAL X( * ) +* .. +* +* Purpose +* ======= +* +* ILASLV scans a vector X for its last non-zero entry. Returns 0 if +* all entries are zero. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The number of entries to check in X. +* +* X (input) REAL array, dimension (1+(N-2)*abs(INCX)) +* The vector X. +* +* INCX (input) INTEGER +* The increment between elements of X. INCX > 0. +* +* ===================================================================== +* +* .. Parameters .. + REAL ZERO + PARAMETER ( ZERO = 0.0 ) +* .. +* .. Local Scalars .. + INTEGER I +* .. +* .. Executable Statements .. +* +* Quick test for the common case where the last entry is non-zero. + IF( N.EQ.0 ) THEN + ILASLV = N + ELSE IF( X( 1 + (N-1)*INCX ).NE.ZERO ) THEN + ILASLV = N + ELSE +* Scan back from the end of the vector. + DO I = N, 1, -1 + IF( X( 1 + (I-1)*INCX ).NE.ZERO ) EXIT + END DO + ILASLV = I + END IF + RETURN + END FUNCTION diff --git a/SRC/ilazlv.f b/SRC/ilazlv.f new file mode 100644 index 0000000..7071488 --- /dev/null +++ b/SRC/ilazlv.f @@ -0,0 +1,57 @@ + INTEGER FUNCTION ILAZLV(N, X, INCX) + IMPLICIT NONE +* +* -- LAPACK auxiliary routine (version 3.2) -- +* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. +* December 2007 +* +* .. Scalar Arguments .. + INTEGER N, INCX +* .. +* .. Array Arguments .. + COMPLEX*16 X( * ) +* .. +* +* Purpose +* ======= +* +* ILAZLV scans a vector X for its last non-zero entry. Returns 0 if +* all entries are zero. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The number of entries to check in X. +* +* X (input) COMPLEX*16 array, dimension (1+(N-2)*abs(INCX)) +* The vector X. +* +* INCX (input) INTEGER +* The increment between elements of X. INCX > 0. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER ( ZERO = (0.0D+0, 0.0D+0) ) +* .. +* .. Local Scalars .. + INTEGER I +* .. +* .. Executable Statements .. +* +* Quick test for the common case where the last entry is non-zero. + IF( N.EQ.0 ) THEN + ILAZLV = N + ELSE IF( X( 1 + (N-1)*INCX ).NE.ZERO ) THEN + ILAZLV = N + ELSE +* Scan back from the end of the vector. + DO I = N, 1, -1 + IF( X( 1 + (I-1)*INCX ).NE.ZERO ) EXIT + END DO + ILAZLV = I + END IF + RETURN + END FUNCTION -- 1.6.2.251.gb2e4c