Go to the documentation of this file.00001 SUBROUTINE DLARRC( JOBT, N, VL, VU, D, E, PIVMIN,
00002 $ EIGCNT, LCNT, RCNT, INFO )
00003
00004
00005
00006
00007
00008
00009
00010 CHARACTER JOBT
00011 INTEGER EIGCNT, INFO, LCNT, N, RCNT
00012 DOUBLE PRECISION PIVMIN, VL, VU
00013
00014
00015 DOUBLE PRECISION D( * ), E( * )
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
00066
00067
00068
00069
00070
00071
00072
00073 DOUBLE PRECISION ZERO
00074 PARAMETER ( ZERO = 0.0D0 )
00075
00076
00077 INTEGER I
00078 LOGICAL MATT
00079 DOUBLE PRECISION LPIVOT, RPIVOT, SL, SU, TMP, TMP2
00080
00081
00082
00083 LOGICAL LSAME
00084 EXTERNAL LSAME
00085
00086
00087
00088 INFO = 0
00089 LCNT = 0
00090 RCNT = 0
00091 EIGCNT = 0
00092 MATT = LSAME( JOBT, 'T' )
00093
00094
00095 IF (MATT) THEN
00096
00097 LPIVOT = D( 1 ) - VL
00098 RPIVOT = D( 1 ) - VU
00099 IF( LPIVOT.LE.ZERO ) THEN
00100 LCNT = LCNT + 1
00101 ENDIF
00102 IF( RPIVOT.LE.ZERO ) THEN
00103 RCNT = RCNT + 1
00104 ENDIF
00105 DO 10 I = 1, N-1
00106 TMP = E(I)**2
00107 LPIVOT = ( D( I+1 )-VL ) - TMP/LPIVOT
00108 RPIVOT = ( D( I+1 )-VU ) - TMP/RPIVOT
00109 IF( LPIVOT.LE.ZERO ) THEN
00110 LCNT = LCNT + 1
00111 ENDIF
00112 IF( RPIVOT.LE.ZERO ) THEN
00113 RCNT = RCNT + 1
00114 ENDIF
00115 10 CONTINUE
00116 ELSE
00117
00118 SL = -VL
00119 SU = -VU
00120 DO 20 I = 1, N - 1
00121 LPIVOT = D( I ) + SL
00122 RPIVOT = D( I ) + SU
00123 IF( LPIVOT.LE.ZERO ) THEN
00124 LCNT = LCNT + 1
00125 ENDIF
00126 IF( RPIVOT.LE.ZERO ) THEN
00127 RCNT = RCNT + 1
00128 ENDIF
00129 TMP = E(I) * D(I) * E(I)
00130
00131 TMP2 = TMP / LPIVOT
00132 IF( TMP2.EQ.ZERO ) THEN
00133 SL = TMP - VL
00134 ELSE
00135 SL = SL*TMP2 - VL
00136 END IF
00137
00138 TMP2 = TMP / RPIVOT
00139 IF( TMP2.EQ.ZERO ) THEN
00140 SU = TMP - VU
00141 ELSE
00142 SU = SU*TMP2 - VU
00143 END IF
00144 20 CONTINUE
00145 LPIVOT = D( N ) + SL
00146 RPIVOT = D( N ) + SU
00147 IF( LPIVOT.LE.ZERO ) THEN
00148 LCNT = LCNT + 1
00149 ENDIF
00150 IF( RPIVOT.LE.ZERO ) THEN
00151 RCNT = RCNT + 1
00152 ENDIF
00153 ENDIF
00154 EIGCNT = RCNT - LCNT
00155
00156 RETURN
00157
00158
00159
00160 END