LAPACK 3.3.0

dlarrc.f

Go to the documentation of this file.
00001       SUBROUTINE DLARRC( JOBT, N, VL, VU, D, E, PIVMIN,
00002      $                            EIGCNT, LCNT, RCNT, INFO )
00003 *
00004 *  -- LAPACK auxiliary routine (version 3.2) --
00005 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
00006 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00007 *     November 2006
00008 *
00009 *     .. Scalar Arguments ..
00010       CHARACTER          JOBT
00011       INTEGER            EIGCNT, INFO, LCNT, N, RCNT
00012       DOUBLE PRECISION   PIVMIN, VL, VU
00013 *     ..
00014 *     .. Array Arguments ..
00015       DOUBLE PRECISION   D( * ), E( * )
00016 *     ..
00017 *
00018 *  Purpose
00019 *  =======
00020 *
00021 *  Find the number of eigenvalues of the symmetric tridiagonal matrix T
00022 *  that are in the interval (VL,VU] if JOBT = 'T', and of L D L^T
00023 *  if JOBT = 'L'.
00024 *
00025 *  Arguments
00026 *  =========
00027 *
00028 *  JOBT    (input) CHARACTER*1
00029 *          = 'T':  Compute Sturm count for matrix T.
00030 *          = 'L':  Compute Sturm count for matrix L D L^T.
00031 *
00032 *  N       (input) INTEGER
00033 *          The order of the matrix. N > 0.
00034 *
00035 *  VL      (input) DOUBLE PRECISION
00036 *  VU      (input) DOUBLE PRECISION
00037 *          The lower and upper bounds for the eigenvalues.
00038 *
00039 *  D       (input) DOUBLE PRECISION array, dimension (N)
00040 *          JOBT = 'T': The N diagonal elements of the tridiagonal matrix T.
00041 *          JOBT = 'L': The N diagonal elements of the diagonal matrix D.
00042 *
00043 *  E       (input) DOUBLE PRECISION array, dimension (N)
00044 *          JOBT = 'T': The N-1 offdiagonal elements of the matrix T.
00045 *          JOBT = 'L': The N-1 offdiagonal elements of the matrix L.
00046 *
00047 *  PIVMIN  (input) DOUBLE PRECISION
00048 *          The minimum pivot in the Sturm sequence for T.
00049 *
00050 *  EIGCNT  (output) INTEGER
00051 *          The number of eigenvalues of the symmetric tridiagonal matrix T
00052 *          that are in the interval (VL,VU]
00053 *
00054 *  LCNT    (output) INTEGER
00055 *  RCNT    (output) INTEGER
00056 *          The left and right negcounts of the interval.
00057 *
00058 *  INFO    (output) INTEGER
00059 *
00060 *  Further Details
00061 *  ===============
00062 *
00063 *  Based on contributions by
00064 *     Beresford Parlett, University of California, Berkeley, USA
00065 *     Jim Demmel, University of California, Berkeley, USA
00066 *     Inderjit Dhillon, University of Texas, Austin, USA
00067 *     Osni Marques, LBNL/NERSC, USA
00068 *     Christof Voemel, University of California, Berkeley, USA
00069 *
00070 *  =====================================================================
00071 *
00072 *     .. Parameters ..
00073       DOUBLE PRECISION   ZERO
00074       PARAMETER          ( ZERO = 0.0D0 )
00075 *     ..
00076 *     .. Local Scalars ..
00077       INTEGER            I
00078       LOGICAL            MATT
00079       DOUBLE PRECISION   LPIVOT, RPIVOT, SL, SU, TMP, TMP2
00080 
00081 *     ..
00082 *     .. External Functions ..
00083       LOGICAL            LSAME
00084       EXTERNAL           LSAME
00085 *     ..
00086 *     .. Executable Statements ..
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 *        Sturm sequence count on T
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 *        Sturm sequence count on L D L^T
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 *     end of DLARRC
00159 *
00160       END
 All Files Functions