Go to the documentation of this file.00001 SUBROUTINE DSTECH( N, A, B, EIG, TOL, WORK, INFO )
00002
00003
00004
00005
00006
00007
00008 INTEGER INFO, N
00009 DOUBLE PRECISION TOL
00010
00011
00012 DOUBLE PRECISION A( * ), B( * ), EIG( * ), WORK( * )
00013
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 DOUBLE PRECISION ZERO
00062 PARAMETER ( ZERO = 0.0D0 )
00063
00064
00065 INTEGER BPNT, COUNT, I, ISUB, J, NUML, NUMU, TPNT
00066 DOUBLE PRECISION EMIN, EPS, LOWER, MX, TUPPR, UNFLEP, UPPER
00067
00068
00069 DOUBLE PRECISION DLAMCH
00070 EXTERNAL DLAMCH
00071
00072
00073 EXTERNAL DSTECT
00074
00075
00076 INTRINSIC ABS, MAX
00077
00078
00079
00080
00081
00082 INFO = 0
00083 IF( N.EQ.0 )
00084 $ RETURN
00085 IF( N.LT.0 ) THEN
00086 INFO = -1
00087 RETURN
00088 END IF
00089 IF( TOL.LT.ZERO ) THEN
00090 INFO = -5
00091 RETURN
00092 END IF
00093
00094
00095
00096 EPS = DLAMCH( 'Epsilon' )*DLAMCH( 'Base' )
00097 UNFLEP = DLAMCH( 'Safe minimum' ) / EPS
00098 EPS = TOL*EPS
00099
00100
00101
00102 MX = ABS( EIG( 1 ) )
00103 DO 10 I = 2, N
00104 MX = MAX( MX, ABS( EIG( I ) ) )
00105 10 CONTINUE
00106 EPS = MAX( EPS*MX, UNFLEP )
00107
00108
00109
00110 DO 20 I = 1, N
00111 WORK( I ) = EIG( I )
00112 20 CONTINUE
00113 DO 40 I = 1, N - 1
00114 ISUB = 1
00115 EMIN = WORK( 1 )
00116 DO 30 J = 2, N + 1 - I
00117 IF( WORK( J ).LT.EMIN ) THEN
00118 ISUB = J
00119 EMIN = WORK( J )
00120 END IF
00121 30 CONTINUE
00122 IF( ISUB.NE.N+1-I ) THEN
00123 WORK( ISUB ) = WORK( N+1-I )
00124 WORK( N+1-I ) = EMIN
00125 END IF
00126 40 CONTINUE
00127
00128
00129
00130
00131 TPNT = 1
00132 BPNT = 1
00133
00134
00135
00136 50 CONTINUE
00137 UPPER = WORK( TPNT ) + EPS
00138 LOWER = WORK( BPNT ) - EPS
00139
00140
00141
00142 60 CONTINUE
00143 IF( BPNT.EQ.N )
00144 $ GO TO 70
00145 TUPPR = WORK( BPNT+1 ) + EPS
00146 IF( TUPPR.LT.LOWER )
00147 $ GO TO 70
00148
00149
00150
00151 BPNT = BPNT + 1
00152 LOWER = WORK( BPNT ) - EPS
00153 GO TO 60
00154 70 CONTINUE
00155
00156
00157
00158 CALL DSTECT( N, A, B, LOWER, NUML )
00159 CALL DSTECT( N, A, B, UPPER, NUMU )
00160 COUNT = NUMU - NUML
00161 IF( COUNT.NE.BPNT-TPNT+1 ) THEN
00162
00163
00164
00165 INFO = TPNT
00166 GO TO 80
00167 END IF
00168 TPNT = BPNT + 1
00169 BPNT = TPNT
00170 IF( TPNT.LE.N )
00171 $ GO TO 50
00172 80 CONTINUE
00173 RETURN
00174
00175
00176
00177 END