LAPACK 3.3.0

zlacn2.f

Go to the documentation of this file.
00001       SUBROUTINE ZLACN2( N, V, X, EST, KASE, ISAVE )
00002 *
00003 *  -- LAPACK auxiliary routine (version 3.2) --
00004 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
00005 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00006 *     November 2006
00007 *
00008 *     .. Scalar Arguments ..
00009       INTEGER            KASE, N
00010       DOUBLE PRECISION   EST
00011 *     ..
00012 *     .. Array Arguments ..
00013       INTEGER            ISAVE( 3 )
00014       COMPLEX*16         V( * ), X( * )
00015 *     ..
00016 *
00017 *  Purpose
00018 *  =======
00019 *
00020 *  ZLACN2 estimates the 1-norm of a square, complex matrix A.
00021 *  Reverse communication is used for evaluating matrix-vector products.
00022 *
00023 *  Arguments
00024 *  =========
00025 *
00026 *  N      (input) INTEGER
00027 *         The order of the matrix.  N >= 1.
00028 *
00029 *  V      (workspace) COMPLEX*16 array, dimension (N)
00030 *         On the final return, V = A*W,  where  EST = norm(V)/norm(W)
00031 *         (W is not returned).
00032 *
00033 *  X      (input/output) COMPLEX*16 array, dimension (N)
00034 *         On an intermediate return, X should be overwritten by
00035 *               A * X,   if KASE=1,
00036 *               A' * X,  if KASE=2,
00037 *         where A' is the conjugate transpose of A, and ZLACN2 must be
00038 *         re-called with all the other parameters unchanged.
00039 *
00040 *  EST    (input/output) DOUBLE PRECISION
00041 *         On entry with KASE = 1 or 2 and ISAVE(1) = 3, EST should be
00042 *         unchanged from the previous call to ZLACN2.
00043 *         On exit, EST is an estimate (a lower bound) for norm(A). 
00044 *
00045 *  KASE   (input/output) INTEGER
00046 *         On the initial call to ZLACN2, KASE should be 0.
00047 *         On an intermediate return, KASE will be 1 or 2, indicating
00048 *         whether X should be overwritten by A * X  or A' * X.
00049 *         On the final return from ZLACN2, KASE will again be 0.
00050 *
00051 *  ISAVE  (input/output) INTEGER array, dimension (3)
00052 *         ISAVE is used to save variables between calls to ZLACN2
00053 *
00054 *  Further Details
00055 *  ======= =======
00056 *
00057 *  Contributed by Nick Higham, University of Manchester.
00058 *  Originally named CONEST, dated March 16, 1988.
00059 *
00060 *  Reference: N.J. Higham, "FORTRAN codes for estimating the one-norm of
00061 *  a real or complex matrix, with applications to condition estimation",
00062 *  ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988.
00063 *
00064 *  Last modified:  April, 1999
00065 *
00066 *  This is a thread safe version of ZLACON, which uses the array ISAVE
00067 *  in place of a SAVE statement, as follows:
00068 *
00069 *     ZLACON     ZLACN2
00070 *      JUMP     ISAVE(1)
00071 *      J        ISAVE(2)
00072 *      ITER     ISAVE(3)
00073 *
00074 *  =====================================================================
00075 *
00076 *     .. Parameters ..
00077       INTEGER              ITMAX
00078       PARAMETER          ( ITMAX = 5 )
00079       DOUBLE PRECISION     ONE,         TWO
00080       PARAMETER          ( ONE = 1.0D0, TWO = 2.0D0 )
00081       COMPLEX*16           CZERO, CONE
00082       PARAMETER          ( CZERO = ( 0.0D0, 0.0D0 ),
00083      $                            CONE = ( 1.0D0, 0.0D0 ) )
00084 *     ..
00085 *     .. Local Scalars ..
00086       INTEGER            I, JLAST
00087       DOUBLE PRECISION   ABSXI, ALTSGN, ESTOLD, SAFMIN, TEMP
00088 *     ..
00089 *     .. External Functions ..
00090       INTEGER            IZMAX1
00091       DOUBLE PRECISION   DLAMCH, DZSUM1
00092       EXTERNAL           IZMAX1, DLAMCH, DZSUM1
00093 *     ..
00094 *     .. External Subroutines ..
00095       EXTERNAL           ZCOPY
00096 *     ..
00097 *     .. Intrinsic Functions ..
00098       INTRINSIC          ABS, DBLE, DCMPLX, DIMAG
00099 *     ..
00100 *     .. Executable Statements ..
00101 *
00102       SAFMIN = DLAMCH( 'Safe minimum' )
00103       IF( KASE.EQ.0 ) THEN
00104          DO 10 I = 1, N
00105             X( I ) = DCMPLX( ONE / DBLE( N ) )
00106    10    CONTINUE
00107          KASE = 1
00108          ISAVE( 1 ) = 1
00109          RETURN
00110       END IF
00111 *
00112       GO TO ( 20, 40, 70, 90, 120 )ISAVE( 1 )
00113 *
00114 *     ................ ENTRY   (ISAVE( 1 ) = 1)
00115 *     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY A*X.
00116 *
00117    20 CONTINUE
00118       IF( N.EQ.1 ) THEN
00119          V( 1 ) = X( 1 )
00120          EST = ABS( V( 1 ) )
00121 *        ... QUIT
00122          GO TO 130
00123       END IF
00124       EST = DZSUM1( N, X, 1 )
00125 *
00126       DO 30 I = 1, N
00127          ABSXI = ABS( X( I ) )
00128          IF( ABSXI.GT.SAFMIN ) THEN
00129             X( I ) = DCMPLX( DBLE( X( I ) ) / ABSXI,
00130      $               DIMAG( X( I ) ) / ABSXI )
00131          ELSE
00132             X( I ) = CONE
00133          END IF
00134    30 CONTINUE
00135       KASE = 2
00136       ISAVE( 1 ) = 2
00137       RETURN
00138 *
00139 *     ................ ENTRY   (ISAVE( 1 ) = 2)
00140 *     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
00141 *
00142    40 CONTINUE
00143       ISAVE( 2 ) = IZMAX1( N, X, 1 )
00144       ISAVE( 3 ) = 2
00145 *
00146 *     MAIN LOOP - ITERATIONS 2,3,...,ITMAX.
00147 *
00148    50 CONTINUE
00149       DO 60 I = 1, N
00150          X( I ) = CZERO
00151    60 CONTINUE
00152       X( ISAVE( 2 ) ) = CONE
00153       KASE = 1
00154       ISAVE( 1 ) = 3
00155       RETURN
00156 *
00157 *     ................ ENTRY   (ISAVE( 1 ) = 3)
00158 *     X HAS BEEN OVERWRITTEN BY A*X.
00159 *
00160    70 CONTINUE
00161       CALL ZCOPY( N, X, 1, V, 1 )
00162       ESTOLD = EST
00163       EST = DZSUM1( N, V, 1 )
00164 *
00165 *     TEST FOR CYCLING.
00166       IF( EST.LE.ESTOLD )
00167      $   GO TO 100
00168 *
00169       DO 80 I = 1, N
00170          ABSXI = ABS( X( I ) )
00171          IF( ABSXI.GT.SAFMIN ) THEN
00172             X( I ) = DCMPLX( DBLE( X( I ) ) / ABSXI,
00173      $               DIMAG( X( I ) ) / ABSXI )
00174          ELSE
00175             X( I ) = CONE
00176          END IF
00177    80 CONTINUE
00178       KASE = 2
00179       ISAVE( 1 ) = 4
00180       RETURN
00181 *
00182 *     ................ ENTRY   (ISAVE( 1 ) = 4)
00183 *     X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
00184 *
00185    90 CONTINUE
00186       JLAST = ISAVE( 2 )
00187       ISAVE( 2 ) = IZMAX1( N, X, 1 )
00188       IF( ( ABS( X( JLAST ) ).NE.ABS( X( ISAVE( 2 ) ) ) ) .AND.
00189      $    ( ISAVE( 3 ).LT.ITMAX ) ) THEN
00190          ISAVE( 3 ) = ISAVE( 3 ) + 1
00191          GO TO 50
00192       END IF
00193 *
00194 *     ITERATION COMPLETE.  FINAL STAGE.
00195 *
00196   100 CONTINUE
00197       ALTSGN = ONE
00198       DO 110 I = 1, N
00199          X( I ) = DCMPLX( ALTSGN*( ONE+DBLE( I-1 ) / DBLE( N-1 ) ) )
00200          ALTSGN = -ALTSGN
00201   110 CONTINUE
00202       KASE = 1
00203       ISAVE( 1 ) = 5
00204       RETURN
00205 *
00206 *     ................ ENTRY   (ISAVE( 1 ) = 5)
00207 *     X HAS BEEN OVERWRITTEN BY A*X.
00208 *
00209   120 CONTINUE
00210       TEMP = TWO*( DZSUM1( N, X, 1 ) / DBLE( 3*N ) )
00211       IF( TEMP.GT.EST ) THEN
00212          CALL ZCOPY( N, X, 1, V, 1 )
00213          EST = TEMP
00214       END IF
00215 *
00216   130 CONTINUE
00217       KASE = 0
00218       RETURN
00219 *
00220 *     End of ZLACN2
00221 *
00222       END
 All Files Functions