00001 SUBROUTINE ZLACON( N, V, X, EST, KASE )
00002
00003
00004
00005
00006
00007
00008
00009 INTEGER KASE, N
00010 DOUBLE PRECISION EST
00011
00012
00013 COMPLEX*16 V( N ), X( N )
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 INTEGER ITMAX
00066 PARAMETER ( ITMAX = 5 )
00067 DOUBLE PRECISION ONE, TWO
00068 PARAMETER ( ONE = 1.0D0, TWO = 2.0D0 )
00069 COMPLEX*16 CZERO, CONE
00070 PARAMETER ( CZERO = ( 0.0D0, 0.0D0 ),
00071 $ CONE = ( 1.0D0, 0.0D0 ) )
00072
00073
00074 INTEGER I, ITER, J, JLAST, JUMP
00075 DOUBLE PRECISION ABSXI, ALTSGN, ESTOLD, SAFMIN, TEMP
00076
00077
00078 INTEGER IZMAX1
00079 DOUBLE PRECISION DLAMCH, DZSUM1
00080 EXTERNAL IZMAX1, DLAMCH, DZSUM1
00081
00082
00083 EXTERNAL ZCOPY
00084
00085
00086 INTRINSIC ABS, DBLE, DCMPLX, DIMAG
00087
00088
00089 SAVE
00090
00091
00092
00093 SAFMIN = DLAMCH( 'Safe minimum' )
00094 IF( KASE.EQ.0 ) THEN
00095 DO 10 I = 1, N
00096 X( I ) = DCMPLX( ONE / DBLE( 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
00106
00107
00108 20 CONTINUE
00109 IF( N.EQ.1 ) THEN
00110 V( 1 ) = X( 1 )
00111 EST = ABS( V( 1 ) )
00112
00113 GO TO 130
00114 END IF
00115 EST = DZSUM1( N, X, 1 )
00116
00117 DO 30 I = 1, N
00118 ABSXI = ABS( X( I ) )
00119 IF( ABSXI.GT.SAFMIN ) THEN
00120 X( I ) = DCMPLX( DBLE( X( I ) ) / ABSXI,
00121 $ DIMAG( 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
00131
00132
00133 40 CONTINUE
00134 J = IZMAX1( N, X, 1 )
00135 ITER = 2
00136
00137
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
00149
00150
00151 70 CONTINUE
00152 CALL ZCOPY( N, X, 1, V, 1 )
00153 ESTOLD = EST
00154 EST = DZSUM1( N, V, 1 )
00155
00156
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 ) = DCMPLX( DBLE( X( I ) ) / ABSXI,
00164 $ DIMAG( 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
00174
00175
00176 90 CONTINUE
00177 JLAST = J
00178 J = IZMAX1( 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
00186
00187 100 CONTINUE
00188 ALTSGN = ONE
00189 DO 110 I = 1, N
00190 X( I ) = DCMPLX( ALTSGN*( ONE+DBLE( I-1 ) / DBLE( N-1 ) ) )
00191 ALTSGN = -ALTSGN
00192 110 CONTINUE
00193 KASE = 1
00194 JUMP = 5
00195 RETURN
00196
00197
00198
00199
00200 120 CONTINUE
00201 TEMP = TWO*( DZSUM1( N, X, 1 ) / DBLE( 3*N ) )
00202 IF( TEMP.GT.EST ) THEN
00203 CALL ZCOPY( N, X, 1, V, 1 )
00204 EST = TEMP
00205 END IF
00206
00207 130 CONTINUE
00208 KASE = 0
00209 RETURN
00210
00211
00212
00213 END