File:  [local] / rpl / lapack / lapack / dlarrc.f
Revision 1.20: download - view: text, annotated - select for diffs - revision graph
Mon Aug 7 08:38:57 2023 UTC (9 months, 1 week ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_35, rpl-4_1_34, HEAD
Première mise à jour de lapack et blas.

    1: *> \brief \b DLARRC computes the number of eigenvalues of the symmetric tridiagonal matrix.
    2: *
    3: *  =========== DOCUMENTATION ===========
    4: *
    5: * Online html documentation available at
    6: *            http://www.netlib.org/lapack/explore-html/
    7: *
    8: *> \htmlonly
    9: *> Download DLARRC + dependencies
   10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarrc.f">
   11: *> [TGZ]</a>
   12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarrc.f">
   13: *> [ZIP]</a>
   14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarrc.f">
   15: *> [TXT]</a>
   16: *> \endhtmlonly
   17: *
   18: *  Definition:
   19: *  ===========
   20: *
   21: *       SUBROUTINE DLARRC( JOBT, N, VL, VU, D, E, PIVMIN,
   22: *                                   EIGCNT, LCNT, RCNT, INFO )
   23: *
   24: *       .. Scalar Arguments ..
   25: *       CHARACTER          JOBT
   26: *       INTEGER            EIGCNT, INFO, LCNT, N, RCNT
   27: *       DOUBLE PRECISION   PIVMIN, VL, VU
   28: *       ..
   29: *       .. Array Arguments ..
   30: *       DOUBLE PRECISION   D( * ), E( * )
   31: *       ..
   32: *
   33: *
   34: *> \par Purpose:
   35: *  =============
   36: *>
   37: *> \verbatim
   38: *>
   39: *> Find the number of eigenvalues of the symmetric tridiagonal matrix T
   40: *> that are in the interval (VL,VU] if JOBT = 'T', and of L D L^T
   41: *> if JOBT = 'L'.
   42: *> \endverbatim
   43: *
   44: *  Arguments:
   45: *  ==========
   46: *
   47: *> \param[in] JOBT
   48: *> \verbatim
   49: *>          JOBT is CHARACTER*1
   50: *>          = 'T':  Compute Sturm count for matrix T.
   51: *>          = 'L':  Compute Sturm count for matrix L D L^T.
   52: *> \endverbatim
   53: *>
   54: *> \param[in] N
   55: *> \verbatim
   56: *>          N is INTEGER
   57: *>          The order of the matrix. N > 0.
   58: *> \endverbatim
   59: *>
   60: *> \param[in] VL
   61: *> \verbatim
   62: *>          VL is DOUBLE PRECISION
   63: *>          The lower bound for the eigenvalues.
   64: *> \endverbatim
   65: *>
   66: *> \param[in] VU
   67: *> \verbatim
   68: *>          VU is DOUBLE PRECISION
   69: *>          The upper bound for the eigenvalues.
   70: *> \endverbatim
   71: *>
   72: *> \param[in] D
   73: *> \verbatim
   74: *>          D is DOUBLE PRECISION array, dimension (N)
   75: *>          JOBT = 'T': The N diagonal elements of the tridiagonal matrix T.
   76: *>          JOBT = 'L': The N diagonal elements of the diagonal matrix D.
   77: *> \endverbatim
   78: *>
   79: *> \param[in] E
   80: *> \verbatim
   81: *>          E is DOUBLE PRECISION array, dimension (N)
   82: *>          JOBT = 'T': The N-1 offdiagonal elements of the matrix T.
   83: *>          JOBT = 'L': The N-1 offdiagonal elements of the matrix L.
   84: *> \endverbatim
   85: *>
   86: *> \param[in] PIVMIN
   87: *> \verbatim
   88: *>          PIVMIN is DOUBLE PRECISION
   89: *>          The minimum pivot in the Sturm sequence for T.
   90: *> \endverbatim
   91: *>
   92: *> \param[out] EIGCNT
   93: *> \verbatim
   94: *>          EIGCNT is INTEGER
   95: *>          The number of eigenvalues of the symmetric tridiagonal matrix T
   96: *>          that are in the interval (VL,VU]
   97: *> \endverbatim
   98: *>
   99: *> \param[out] LCNT
  100: *> \verbatim
  101: *>          LCNT is INTEGER
  102: *> \endverbatim
  103: *>
  104: *> \param[out] RCNT
  105: *> \verbatim
  106: *>          RCNT is INTEGER
  107: *>          The left and right negcounts of the interval.
  108: *> \endverbatim
  109: *>
  110: *> \param[out] INFO
  111: *> \verbatim
  112: *>          INFO is INTEGER
  113: *> \endverbatim
  114: *
  115: *  Authors:
  116: *  ========
  117: *
  118: *> \author Univ. of Tennessee
  119: *> \author Univ. of California Berkeley
  120: *> \author Univ. of Colorado Denver
  121: *> \author NAG Ltd.
  122: *
  123: *> \ingroup OTHERauxiliary
  124: *
  125: *> \par Contributors:
  126: *  ==================
  127: *>
  128: *> Beresford Parlett, University of California, Berkeley, USA \n
  129: *> Jim Demmel, University of California, Berkeley, USA \n
  130: *> Inderjit Dhillon, University of Texas, Austin, USA \n
  131: *> Osni Marques, LBNL/NERSC, USA \n
  132: *> Christof Voemel, University of California, Berkeley, USA
  133: *
  134: *  =====================================================================
  135:       SUBROUTINE DLARRC( JOBT, N, VL, VU, D, E, PIVMIN,
  136:      $                            EIGCNT, LCNT, RCNT, INFO )
  137: *
  138: *  -- LAPACK auxiliary routine --
  139: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  140: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  141: *
  142: *     .. Scalar Arguments ..
  143:       CHARACTER          JOBT
  144:       INTEGER            EIGCNT, INFO, LCNT, N, RCNT
  145:       DOUBLE PRECISION   PIVMIN, VL, VU
  146: *     ..
  147: *     .. Array Arguments ..
  148:       DOUBLE PRECISION   D( * ), E( * )
  149: *     ..
  150: *
  151: *  =====================================================================
  152: *
  153: *     .. Parameters ..
  154:       DOUBLE PRECISION   ZERO
  155:       PARAMETER          ( ZERO = 0.0D0 )
  156: *     ..
  157: *     .. Local Scalars ..
  158:       INTEGER            I
  159:       LOGICAL            MATT
  160:       DOUBLE PRECISION   LPIVOT, RPIVOT, SL, SU, TMP, TMP2
  161: 
  162: *     ..
  163: *     .. External Functions ..
  164:       LOGICAL            LSAME
  165:       EXTERNAL           LSAME
  166: *     ..
  167: *     .. Executable Statements ..
  168: *
  169:       INFO = 0
  170: *
  171: *     Quick return if possible
  172: *
  173:       IF( N.LE.0 ) THEN
  174:          RETURN
  175:       END IF
  176: *
  177:       LCNT = 0
  178:       RCNT = 0
  179:       EIGCNT = 0
  180:       MATT = LSAME( JOBT, 'T' )
  181: 
  182: 
  183:       IF (MATT) THEN
  184: *        Sturm sequence count on T
  185:          LPIVOT = D( 1 ) - VL
  186:          RPIVOT = D( 1 ) - VU
  187:          IF( LPIVOT.LE.ZERO ) THEN
  188:             LCNT = LCNT + 1
  189:          ENDIF
  190:          IF( RPIVOT.LE.ZERO ) THEN
  191:             RCNT = RCNT + 1
  192:          ENDIF
  193:          DO 10 I = 1, N-1
  194:             TMP = E(I)**2
  195:             LPIVOT = ( D( I+1 )-VL ) - TMP/LPIVOT
  196:             RPIVOT = ( D( I+1 )-VU ) - TMP/RPIVOT
  197:             IF( LPIVOT.LE.ZERO ) THEN
  198:                LCNT = LCNT + 1
  199:             ENDIF
  200:             IF( RPIVOT.LE.ZERO ) THEN
  201:                RCNT = RCNT + 1
  202:             ENDIF
  203:  10      CONTINUE
  204:       ELSE
  205: *        Sturm sequence count on L D L^T
  206:          SL = -VL
  207:          SU = -VU
  208:          DO 20 I = 1, N - 1
  209:             LPIVOT = D( I ) + SL
  210:             RPIVOT = D( I ) + SU
  211:             IF( LPIVOT.LE.ZERO ) THEN
  212:                LCNT = LCNT + 1
  213:             ENDIF
  214:             IF( RPIVOT.LE.ZERO ) THEN
  215:                RCNT = RCNT + 1
  216:             ENDIF
  217:             TMP = E(I) * D(I) * E(I)
  218: *
  219:             TMP2 = TMP / LPIVOT
  220:             IF( TMP2.EQ.ZERO ) THEN
  221:                SL =  TMP - VL
  222:             ELSE
  223:                SL = SL*TMP2 - VL
  224:             END IF
  225: *
  226:             TMP2 = TMP / RPIVOT
  227:             IF( TMP2.EQ.ZERO ) THEN
  228:                SU =  TMP - VU
  229:             ELSE
  230:                SU = SU*TMP2 - VU
  231:             END IF
  232:  20      CONTINUE
  233:          LPIVOT = D( N ) + SL
  234:          RPIVOT = D( N ) + SU
  235:          IF( LPIVOT.LE.ZERO ) THEN
  236:             LCNT = LCNT + 1
  237:          ENDIF
  238:          IF( RPIVOT.LE.ZERO ) THEN
  239:             RCNT = RCNT + 1
  240:          ENDIF
  241:       ENDIF
  242:       EIGCNT = RCNT - LCNT
  243: 
  244:       RETURN
  245: *
  246: *     End of DLARRC
  247: *
  248:       END

CVSweb interface <joel.bertrand@systella.fr>