version 1.1, 2010/01/26 15:22:46
|
version 1.19, 2023/08/07 08:38:53
|
Line 1
|
Line 1
|
|
*> \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 |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlacn2.f"> |
|
*> [TGZ]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlacn2.f"> |
|
*> [ZIP]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlacn2.f"> |
|
*> [TXT]</a> |
|
*> \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 ) |
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, -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* November 2006 |
|
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
INTEGER KASE, N |
INTEGER KASE, N |
Line 14
|
Line 147
|
DOUBLE PRECISION V( * ), X( * ) |
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 .. |
* .. Parameters .. |
Line 81
|
Line 157
|
* .. |
* .. |
* .. Local Scalars .. |
* .. Local Scalars .. |
INTEGER I, JLAST |
INTEGER I, JLAST |
DOUBLE PRECISION ALTSGN, ESTOLD, TEMP |
DOUBLE PRECISION ALTSGN, ESTOLD, TEMP, XS |
* .. |
* .. |
* .. External Functions .. |
* .. External Functions .. |
INTEGER IDAMAX |
INTEGER IDAMAX |
Line 92
|
Line 168
|
EXTERNAL DCOPY |
EXTERNAL DCOPY |
* .. |
* .. |
* .. Intrinsic Functions .. |
* .. Intrinsic Functions .. |
INTRINSIC ABS, DBLE, NINT, SIGN |
INTRINSIC ABS, DBLE, NINT |
* .. |
* .. |
* .. Executable Statements .. |
* .. Executable Statements .. |
* |
* |
Line 120
|
Line 196
|
EST = DASUM( N, X, 1 ) |
EST = DASUM( N, X, 1 ) |
* |
* |
DO 30 I = 1, N |
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 ) ) |
ISGN( I ) = NINT( X( I ) ) |
30 CONTINUE |
30 CONTINUE |
KASE = 2 |
KASE = 2 |
Line 153
|
Line 233
|
ESTOLD = EST |
ESTOLD = EST |
EST = DASUM( N, V, 1 ) |
EST = DASUM( N, V, 1 ) |
DO 80 I = 1, N |
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 |
$ GO TO 90 |
80 CONTINUE |
80 CONTINUE |
* REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED. |
* REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED. |
Line 165
|
Line 250
|
$ GO TO 120 |
$ GO TO 120 |
* |
* |
DO 100 I = 1, N |
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 ) ) |
ISGN( I ) = NINT( X( I ) ) |
100 CONTINUE |
100 CONTINUE |
KASE = 2 |
KASE = 2 |