From 54d66c762f545a634179707f1cd661989ea33a5f Mon Sep 17 00:00:00 2001 From: langou Date: Mon, 10 Feb 2014 19:55:39 +0000 Subject: ( Let me know if I broke anything. I double checked. We should be fine but ) ( please let me know if concerns/problems. ) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) The comments in ICMAX1 (resp. IZMAX1) were not correct. The comments read: "ICMAX1 finds the index of the element whose real part has maximum absolute value." It should have read: "ICMAX1 finds the index of the first vector element of maximum absolute value." This is corrected. The problem was reported Eloy Romero Alcalde from the SLEPc team, Universitat Politècnica de València and confirmed by Nick Higham, Sven Hammarling and Julien Langou. 2) The routine ICAMAX (resp. IZAMAX) from the BLAS evolved without ICMAX1 (resp. IZMAX1). Reconcialated both version. So essentially took the ICAMAX currently in the BLAS and changed it appropriately for an ICMAX1. 3) Remove the use of statement function in ICMAX1 (resp. IZMAX1). Now obsolete in FORTRAN. 4) Change comments in BLAS routines: SCABS1, DCABS1, ICAMAX, IZAMAX, SCASUM, and DZASUM. Remove the use of "absolute value of a complex number" for the quantity "| Re(.) | + | Im(.) |". For example: before DCABS1 computes absolute value of a double complex number after DCABS1 computes |Re(.)| + |Im(.)| of a double complex number --- BLAS/SRC/dcabs1.f | 2 +- BLAS/SRC/dzasum.f | 3 +- BLAS/SRC/icamax.f | 2 +- BLAS/SRC/idamax.f | 2 +- BLAS/SRC/isamax.f | 2 +- BLAS/SRC/izamax.f | 2 +- BLAS/SRC/scabs1.f | 2 +- BLAS/SRC/scasum.f | 2 +- SRC/icmax1.f | 85 ++++++++++++++++++++--------------------------- SRC/izmax1.f | 99 ++++++++++++++++++++++++------------------------------- 10 files changed, 88 insertions(+), 113 deletions(-) diff --git a/BLAS/SRC/dcabs1.f b/BLAS/SRC/dcabs1.f index f6debb9a..f94a7c87 100644 --- a/BLAS/SRC/dcabs1.f +++ b/BLAS/SRC/dcabs1.f @@ -21,7 +21,7 @@ *> *> \verbatim *> -*> DCABS1 computes absolute value of a double complex number +*> DCABS1 computes |Re(.)| + |Im(.)| of a double complex number *> \endverbatim * * Authors: diff --git a/BLAS/SRC/dzasum.f b/BLAS/SRC/dzasum.f index cbeee993..afb3cf6e 100644 --- a/BLAS/SRC/dzasum.f +++ b/BLAS/SRC/dzasum.f @@ -23,7 +23,8 @@ *> *> \verbatim *> -*> DZASUM takes the sum of the absolute values. +*> DZASUM takes the sum of the (|Re(.)| + |Im(.)|)'s of a complex vector and +*> returns a single precision result. *> \endverbatim * * Authors: diff --git a/BLAS/SRC/icamax.f b/BLAS/SRC/icamax.f index 2120db98..299b2ce6 100644 --- a/BLAS/SRC/icamax.f +++ b/BLAS/SRC/icamax.f @@ -23,7 +23,7 @@ *> *> \verbatim *> -*> ICAMAX finds the index of element having max. absolute value. +*> ICAMAX finds the index of the first element having maximum |Re(.)| + |Im(.)| *> \endverbatim * * Authors: diff --git a/BLAS/SRC/idamax.f b/BLAS/SRC/idamax.f index 4233fcc2..079435ea 100644 --- a/BLAS/SRC/idamax.f +++ b/BLAS/SRC/idamax.f @@ -23,7 +23,7 @@ *> *> \verbatim *> -*> IDAMAX finds the index of element having max. absolute value. +*> IDAMAX finds the index of the first element having maximum absolute value. *> \endverbatim * * Authors: diff --git a/BLAS/SRC/isamax.f b/BLAS/SRC/isamax.f index af977c59..04b730a3 100644 --- a/BLAS/SRC/isamax.f +++ b/BLAS/SRC/isamax.f @@ -23,7 +23,7 @@ *> *> \verbatim *> -*> ISAMAX finds the index of element having max. absolute value. +*> ISAMAX finds the index of the first element having maximum absolute value. *> \endverbatim * * Authors: diff --git a/BLAS/SRC/izamax.f b/BLAS/SRC/izamax.f index d51cd582..8f49e61a 100644 --- a/BLAS/SRC/izamax.f +++ b/BLAS/SRC/izamax.f @@ -23,7 +23,7 @@ *> *> \verbatim *> -*> IZAMAX finds the index of element having max. absolute value. +*> IZAMAX finds the index of the first element having maximum |Re(.)| + |Im(.)| *> \endverbatim * * Authors: diff --git a/BLAS/SRC/scabs1.f b/BLAS/SRC/scabs1.f index cdb5c0b9..f936e347 100644 --- a/BLAS/SRC/scabs1.f +++ b/BLAS/SRC/scabs1.f @@ -20,7 +20,7 @@ *> *> \verbatim *> -*> SCABS1 computes absolute value of a complex number +*> SCABS1 computes |Re(.)| + |Im(.)| of a complex number *> \endverbatim * * Authors: diff --git a/BLAS/SRC/scasum.f b/BLAS/SRC/scasum.f index 03154eb5..733f23f8 100644 --- a/BLAS/SRC/scasum.f +++ b/BLAS/SRC/scasum.f @@ -23,7 +23,7 @@ *> *> \verbatim *> -*> SCASUM takes the sum of the absolute values of a complex vector and +*> SCASUM takes the sum of the (|Re(.)| + |Im(.)|)'s of a complex vector and *> returns a single precision result. *> \endverbatim * diff --git a/SRC/icmax1.f b/SRC/icmax1.f index f312a2d7..0f40e806 100644 --- a/SRC/icmax1.f +++ b/SRC/icmax1.f @@ -1,4 +1,4 @@ -*> \brief \b ICMAX1 finds the index of the vector element whose real part has maximum absolute value. +*> \brief \b ICMAX1 finds the index of the first vector element of maximum absolute value. * * =========== DOCUMENTATION =========== * @@ -33,8 +33,7 @@ *> *> \verbatim *> -*> ICMAX1 finds the index of the element whose real part has maximum -*> absolute value. +*> ICMAX1 finds the index of the first vector element of maximum absolute value. *> *> Based on ICAMAX from Level 1 BLAS. *> The change is to use the 'genuine' absolute value. @@ -52,7 +51,8 @@ *> \param[in] CX *> \verbatim *> CX is COMPLEX array, dimension (N) -*> The vector whose elements will be summed. +*> The vector CX. The ICMAX1 function returns the index of its first +*> element of maximum absolute value. *> \endverbatim *> *> \param[in] INCX @@ -69,7 +69,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \date September 2012 +*> \date February 2014 * *> \ingroup complexOTHERauxiliary * @@ -79,74 +79,61 @@ *> Nick Higham for use with CLACON. * * ===================================================================== - INTEGER FUNCTION ICMAX1( N, CX, INCX ) + INTEGER FUNCTION ICMAX1( N, CX, INCX ) * * -- LAPACK auxiliary routine (version 3.4.2) -- * -- LAPACK is a software package provided by Univ. of Tennessee, -- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* September 2012 +* February 2014 * * .. Scalar Arguments .. INTEGER INCX, N * .. * .. Array Arguments .. - COMPLEX CX( * ) + COMPLEX CX(*) * .. * -* ===================================================================== +* ===================================================================== * * .. Local Scalars .. - INTEGER I, IX REAL SMAX - COMPLEX ZDUM + INTEGER I, IX * .. * .. Intrinsic Functions .. INTRINSIC ABS * .. -* .. Statement Functions .. - REAL CABS1 -* .. -* .. Statement Function definitions .. -* -* NEXT LINE IS THE ONLY MODIFICATION. - CABS1( ZDUM ) = ABS( ZDUM ) -* .. * .. Executable Statements .. * ICMAX1 = 0 - IF( N.LT.1 ) - $ RETURN + IF (N.LT.1 .OR. INCX.LE.0) RETURN ICMAX1 = 1 - IF( N.EQ.1 ) - $ RETURN - IF( INCX.EQ.1 ) - $ GO TO 30 -* -* CODE FOR INCREMENT NOT EQUAL TO 1 -* - IX = 1 - SMAX = CABS1( CX( 1 ) ) - IX = IX + INCX - DO 20 I = 2, N - IF( CABS1( CX( IX ) ).LE.SMAX ) - $ GO TO 10 - ICMAX1 = I - SMAX = CABS1( CX( IX ) ) - 10 CONTINUE - IX = IX + INCX - 20 CONTINUE - RETURN + IF (N.EQ.1) RETURN + IF (INCX.EQ.1) THEN +* +* code for increment equal to 1 * -* CODE FOR INCREMENT EQUAL TO 1 + SMAX = ABS(CX(1)) + DO I = 2,N + IF (ABS(CX(I)).GT.SMAX) THEN + ICMAX1 = I + SMAX = ABS(CX(I)) + END IF + END DO + ELSE * - 30 CONTINUE - SMAX = CABS1( CX( 1 ) ) - DO 40 I = 2, N - IF( CABS1( CX( I ) ).LE.SMAX ) - $ GO TO 40 - ICMAX1 = I - SMAX = CABS1( CX( I ) ) - 40 CONTINUE +* code for increment not equal to 1 +* + IX = 1 + SMAX = ABS(CX(1)) + IX = IX + INCX + DO I = 2,N + IF (ABS(CX(IX)).GT.SMAX) THEN + ICMAX1 = I + SMAX = ABS(CX(IX)) + END IF + IX = IX + INCX + END DO + END IF RETURN * * End of ICMAX1 diff --git a/SRC/izmax1.f b/SRC/izmax1.f index 3f48c348..3471bf6b 100644 --- a/SRC/izmax1.f +++ b/SRC/izmax1.f @@ -1,4 +1,4 @@ -*> \brief \b IZMAX1 finds the index of the vector element whose real part has maximum absolute value. +*> \brief \b IZMAX1 finds the index of the first vector element of maximum absolute value. * * =========== DOCUMENTATION =========== * @@ -18,13 +18,13 @@ * Definition: * =========== * -* INTEGER FUNCTION IZMAX1( N, CX, INCX ) +* INTEGER FUNCTION IZMAX1( N, ZX, INCX ) * * .. Scalar Arguments .. * INTEGER INCX, N * .. * .. Array Arguments .. -* COMPLEX*16 CX( * ) +* COMPLEX*16 ZX( * ) * .. * * @@ -33,8 +33,7 @@ *> *> \verbatim *> -*> IZMAX1 finds the index of the element whose real part has maximum -*> absolute value. +*> IZMAX1 finds the index of the first vector element of maximum absolute value. *> *> Based on IZAMAX from Level 1 BLAS. *> The change is to use the 'genuine' absolute value. @@ -46,19 +45,20 @@ *> \param[in] N *> \verbatim *> N is INTEGER -*> The number of elements in the vector CX. +*> The number of elements in the vector ZX. *> \endverbatim *> -*> \param[in] CX +*> \param[in] ZX *> \verbatim -*> CX is COMPLEX*16 array, dimension (N) -*> The vector whose elements will be summed. +*> ZX is COMPLEX*16 array, dimension (N) +*> The vector ZX. The IZMAX1 function returns the index of its first +*> element of maximum absolute value. *> \endverbatim *> *> \param[in] INCX *> \verbatim *> INCX is INTEGER -*> The spacing between successive values of CX. INCX >= 1. +*> The spacing between successive values of ZX. INCX >= 1. *> \endverbatim * * Authors: @@ -69,9 +69,9 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \date September 2012 +*> \date February 2014 * -*> \ingroup complex16OTHERauxiliary +*> \ingroup complexOTHERauxiliary * *> \par Contributors: * ================== @@ -79,74 +79,61 @@ *> Nick Higham for use with ZLACON. * * ===================================================================== - INTEGER FUNCTION IZMAX1( N, CX, INCX ) + INTEGER FUNCTION IZMAX1( N, ZX, INCX ) * * -- LAPACK auxiliary routine (version 3.4.2) -- * -- LAPACK is a software package provided by Univ. of Tennessee, -- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* September 2012 +* February 2014 * * .. Scalar Arguments .. INTEGER INCX, N * .. * .. Array Arguments .. - COMPLEX*16 CX( * ) + COMPLEX*16 ZX(*) * .. * -* ===================================================================== +* ===================================================================== * * .. Local Scalars .. + DOUBLE PRECISION DMAX INTEGER I, IX - DOUBLE PRECISION SMAX - COMPLEX*16 ZDUM * .. * .. Intrinsic Functions .. INTRINSIC ABS * .. -* .. Statement Functions .. - DOUBLE PRECISION CABS1 -* .. -* .. Statement Function definitions .. -* -* NEXT LINE IS THE ONLY MODIFICATION. - CABS1( ZDUM ) = ABS( ZDUM ) -* .. * .. Executable Statements .. * IZMAX1 = 0 - IF( N.LT.1 ) - $ RETURN + IF (N.LT.1 .OR. INCX.LE.0) RETURN IZMAX1 = 1 - IF( N.EQ.1 ) - $ RETURN - IF( INCX.EQ.1 ) - $ GO TO 30 -* -* CODE FOR INCREMENT NOT EQUAL TO 1 -* - IX = 1 - SMAX = CABS1( CX( 1 ) ) - IX = IX + INCX - DO 20 I = 2, N - IF( CABS1( CX( IX ) ).LE.SMAX ) - $ GO TO 10 - IZMAX1 = I - SMAX = CABS1( CX( IX ) ) - 10 CONTINUE - IX = IX + INCX - 20 CONTINUE - RETURN + IF (N.EQ.1) RETURN + IF (INCX.EQ.1) THEN +* +* code for increment equal to 1 * -* CODE FOR INCREMENT EQUAL TO 1 + DMAX = ABS(ZX(1)) + DO I = 2,N + IF (ABS(ZX(I)).GT.DMAX) THEN + IZMAX1 = I + DMAX = ABS(ZX(I)) + END IF + END DO + ELSE * - 30 CONTINUE - SMAX = CABS1( CX( 1 ) ) - DO 40 I = 2, N - IF( CABS1( CX( I ) ).LE.SMAX ) - $ GO TO 40 - IZMAX1 = I - SMAX = CABS1( CX( I ) ) - 40 CONTINUE +* code for increment not equal to 1 +* + IX = 1 + DMAX = ABS(ZX(1)) + IX = IX + INCX + DO I = 2,N + IF (ABS(ZX(IX)).GT.DMAX) THEN + IZMAX1 = I + DMAX = ABS(ZX(IX)) + END IF + IX = IX + INCX + END DO + END IF RETURN * * End of IZMAX1 -- cgit v1.2.3