--- rpl/lapack/lapack/dlacn2.f 2010/08/06 15:32:25 1.4
+++ rpl/lapack/lapack/dlacn2.f 2023/08/07 08:38:53 1.19
@@ -1,9 +1,142 @@
+*> \brief \b DLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matrix-vector products.
+*
+* =========== DOCUMENTATION ===========
+*
+* Online html documentation available at
+* http://www.netlib.org/lapack/explore-html/
+*
+*> \htmlonly
+*> Download DLACN2 + dependencies
+*>
+*> [TGZ]
+*>
+*> [ZIP]
+*>
+*> [TXT]
+*> \endhtmlonly
+*
+* Definition:
+* ===========
+*
+* SUBROUTINE DLACN2( N, V, X, ISGN, EST, KASE, ISAVE )
+*
+* .. Scalar Arguments ..
+* INTEGER KASE, N
+* DOUBLE PRECISION EST
+* ..
+* .. Array Arguments ..
+* INTEGER ISGN( * ), ISAVE( 3 )
+* DOUBLE PRECISION V( * ), X( * )
+* ..
+*
+*
+*> \par Purpose:
+* =============
+*>
+*> \verbatim
+*>
+*> DLACN2 estimates the 1-norm of a square, real matrix A.
+*> Reverse communication is used for evaluating matrix-vector products.
+*> \endverbatim
+*
+* Arguments:
+* ==========
+*
+*> \param[in] N
+*> \verbatim
+*> N is INTEGER
+*> The order of the matrix. N >= 1.
+*> \endverbatim
+*>
+*> \param[out] V
+*> \verbatim
+*> V is DOUBLE PRECISION array, dimension (N)
+*> On the final return, V = A*W, where EST = norm(V)/norm(W)
+*> (W is not returned).
+*> \endverbatim
+*>
+*> \param[in,out] X
+*> \verbatim
+*> X is DOUBLE PRECISION array, dimension (N)
+*> On an intermediate return, X should be overwritten by
+*> A * X, if KASE=1,
+*> A**T * X, if KASE=2,
+*> and DLACN2 must be re-called with all the other parameters
+*> unchanged.
+*> \endverbatim
+*>
+*> \param[out] ISGN
+*> \verbatim
+*> ISGN is INTEGER array, dimension (N)
+*> \endverbatim
+*>
+*> \param[in,out] EST
+*> \verbatim
+*> EST is DOUBLE PRECISION
+*> On entry with KASE = 1 or 2 and ISAVE(1) = 3, EST should be
+*> unchanged from the previous call to DLACN2.
+*> On exit, EST is an estimate (a lower bound) for norm(A).
+*> \endverbatim
+*>
+*> \param[in,out] KASE
+*> \verbatim
+*> KASE is INTEGER
+*> On the initial call to DLACN2, KASE should be 0.
+*> On an intermediate return, KASE will be 1 or 2, indicating
+*> whether X should be overwritten by A * X or A**T * X.
+*> On the final return from DLACN2, KASE will again be 0.
+*> \endverbatim
+*>
+*> \param[in,out] ISAVE
+*> \verbatim
+*> ISAVE is INTEGER array, dimension (3)
+*> ISAVE is used to save variables between calls to DLACN2
+*> \endverbatim
+*
+* Authors:
+* ========
+*
+*> \author Univ. of Tennessee
+*> \author Univ. of California Berkeley
+*> \author Univ. of Colorado Denver
+*> \author NAG Ltd.
+*
+*> \ingroup doubleOTHERauxiliary
+*
+*> \par Further Details:
+* =====================
+*>
+*> \verbatim
+*>
+*> Originally named SONEST, dated March 16, 1988.
+*>
+*> This is a thread safe version of DLACON, which uses the array ISAVE
+*> in place of a SAVE statement, as follows:
+*>
+*> DLACON DLACN2
+*> JUMP ISAVE(1)
+*> J ISAVE(2)
+*> ITER ISAVE(3)
+*> \endverbatim
+*
+*> \par Contributors:
+* ==================
+*>
+*> Nick Higham, University of Manchester
+*
+*> \par References:
+* ================
+*>
+*> N.J. Higham, "FORTRAN codes for estimating the one-norm of
+*> a real or complex matrix, with applications to condition estimation",
+*> ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988.
+*>
+* =====================================================================
SUBROUTINE DLACN2( N, V, X, ISGN, EST, KASE, ISAVE )
*
-* -- LAPACK auxiliary routine (version 3.2) --
+* -- LAPACK auxiliary routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
-* November 2006
*
* .. Scalar Arguments ..
INTEGER KASE, N
@@ -14,63 +147,6 @@
DOUBLE PRECISION V( * ), X( * )
* ..
*
-* Purpose
-* =======
-*
-* DLACN2 estimates the 1-norm of a square, real matrix A.
-* Reverse communication is used for evaluating matrix-vector products.
-*
-* Arguments
-* =========
-*
-* N (input) INTEGER
-* The order of the matrix. N >= 1.
-*
-* V (workspace) DOUBLE PRECISION array, dimension (N)
-* On the final return, V = A*W, where EST = norm(V)/norm(W)
-* (W is not returned).
-*
-* X (input/output) DOUBLE PRECISION array, dimension (N)
-* On an intermediate return, X should be overwritten by
-* A * X, if KASE=1,
-* A' * X, if KASE=2,
-* and DLACN2 must be re-called with all the other parameters
-* unchanged.
-*
-* ISGN (workspace) INTEGER array, dimension (N)
-*
-* EST (input/output) DOUBLE PRECISION
-* On entry with KASE = 1 or 2 and ISAVE(1) = 3, EST should be
-* unchanged from the previous call to DLACN2.
-* On exit, EST is an estimate (a lower bound) for norm(A).
-*
-* KASE (input/output) INTEGER
-* On the initial call to DLACN2, KASE should be 0.
-* On an intermediate return, KASE will be 1 or 2, indicating
-* whether X should be overwritten by A * X or A' * X.
-* On the final return from DLACN2, KASE will again be 0.
-*
-* ISAVE (input/output) INTEGER array, dimension (3)
-* ISAVE is used to save variables between calls to DLACN2
-*
-* Further Details
-* ======= =======
-*
-* Contributed by Nick Higham, University of Manchester.
-* Originally named SONEST, dated March 16, 1988.
-*
-* Reference: N.J. Higham, "FORTRAN codes for estimating the one-norm of
-* a real or complex matrix, with applications to condition estimation",
-* ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988.
-*
-* This is a thread safe version of DLACON, which uses the array ISAVE
-* in place of a SAVE statement, as follows:
-*
-* DLACON DLACN2
-* JUMP ISAVE(1)
-* J ISAVE(2)
-* ITER ISAVE(3)
-*
* =====================================================================
*
* .. Parameters ..
@@ -81,7 +157,7 @@
* ..
* .. Local Scalars ..
INTEGER I, JLAST
- DOUBLE PRECISION ALTSGN, ESTOLD, TEMP
+ DOUBLE PRECISION ALTSGN, ESTOLD, TEMP, XS
* ..
* .. External Functions ..
INTEGER IDAMAX
@@ -92,7 +168,7 @@
EXTERNAL DCOPY
* ..
* .. Intrinsic Functions ..
- INTRINSIC ABS, DBLE, NINT, SIGN
+ INTRINSIC ABS, DBLE, NINT
* ..
* .. Executable Statements ..
*
@@ -120,7 +196,11 @@
EST = DASUM( N, X, 1 )
*
DO 30 I = 1, N
- X( I ) = SIGN( ONE, X( I ) )
+ IF( X(I).GE.ZERO ) THEN
+ X(I) = ONE
+ ELSE
+ X(I) = -ONE
+ END IF
ISGN( I ) = NINT( X( I ) )
30 CONTINUE
KASE = 2
@@ -153,7 +233,12 @@
ESTOLD = EST
EST = DASUM( N, V, 1 )
DO 80 I = 1, N
- IF( NINT( SIGN( ONE, X( I ) ) ).NE.ISGN( I ) )
+ IF( X(I).GE.ZERO ) THEN
+ XS = ONE
+ ELSE
+ XS = -ONE
+ END IF
+ IF( NINT( XS ).NE.ISGN( I ) )
$ GO TO 90
80 CONTINUE
* REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED.
@@ -165,7 +250,11 @@
$ GO TO 120
*
DO 100 I = 1, N
- X( I ) = SIGN( ONE, X( I ) )
+ IF( X(I).GE.ZERO ) THEN
+ X(I) = ONE
+ ELSE
+ X(I) = -ONE
+ END IF
ISGN( I ) = NINT( X( I ) )
100 CONTINUE
KASE = 2