--- rpl/lapack/lapack/izmax1.f 2010/08/07 13:22:29 1.5 +++ rpl/lapack/lapack/izmax1.f 2017/06/17 11:06:40 1.18 @@ -1,94 +1,139 @@ - INTEGER FUNCTION IZMAX1( N, CX, INCX ) +*> \brief \b IZMAX1 finds the index of the first vector element of maximum absolute value. * -* -- LAPACK auxiliary routine (version 3.2) -- +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download IZMAX1 + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* INTEGER FUNCTION IZMAX1( N, ZX, INCX ) +* +* .. Scalar Arguments .. +* INTEGER INCX, N +* .. +* .. Array Arguments .. +* COMPLEX*16 ZX( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> 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. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of elements in the vector ZX. +*> \endverbatim +*> +*> \param[in] ZX +*> \verbatim +*> 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 ZX. INCX >= 1. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date February 2014 +* +*> \ingroup complexOTHERauxiliary +* +*> \par Contributors: +* ================== +*> +*> Nick Higham for use with ZLACON. +* +* ===================================================================== + INTEGER FUNCTION IZMAX1( N, ZX, INCX ) +* +* -- LAPACK auxiliary routine (version 3.7.0) -- * -- LAPACK is a software package provided by Univ. of Tennessee, -- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2006 +* February 2014 * * .. Scalar Arguments .. INTEGER INCX, N * .. * .. Array Arguments .. - COMPLEX*16 CX( * ) + COMPLEX*16 ZX(*) * .. * -* Purpose -* ======= -* -* IZMAX1 finds the index of the element whose real part has maximum -* absolute value. -* -* Based on IZAMAX from Level 1 BLAS. -* The change is to use the 'genuine' absolute value. -* -* Contributed by Nick Higham for use with ZLACON. -* -* Arguments -* ========= -* -* N (input) INTEGER -* The number of elements in the vector CX. -* -* CX (input) COMPLEX*16 array, dimension (N) -* The vector whose elements will be summed. -* -* INCX (input) INTEGER -* The spacing between successive values of CX. INCX >= 1. -* -* ===================================================================== +* ===================================================================== * * .. 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