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