Annotation of rpl/lapack/lapack/dlaebz.f, revision 1.1

1.1     ! bertrand    1:       SUBROUTINE DLAEBZ( IJOB, NITMAX, N, MMAX, MINP, NBMIN, ABSTOL,
        !             2:      $                   RELTOL, PIVMIN, D, E, E2, NVAL, AB, C, MOUT,
        !             3:      $                   NAB, WORK, IWORK, INFO )
        !             4: *
        !             5: *  -- LAPACK auxiliary routine (version 3.2) --
        !             6: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
        !             7: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
        !             8: *     November 2006
        !             9: *
        !            10: *     .. Scalar Arguments ..
        !            11:       INTEGER            IJOB, INFO, MINP, MMAX, MOUT, N, NBMIN, NITMAX
        !            12:       DOUBLE PRECISION   ABSTOL, PIVMIN, RELTOL
        !            13: *     ..
        !            14: *     .. Array Arguments ..
        !            15:       INTEGER            IWORK( * ), NAB( MMAX, * ), NVAL( * )
        !            16:       DOUBLE PRECISION   AB( MMAX, * ), C( * ), D( * ), E( * ), E2( * ),
        !            17:      $                   WORK( * )
        !            18: *     ..
        !            19: *
        !            20: *  Purpose
        !            21: *  =======
        !            22: *
        !            23: *  DLAEBZ contains the iteration loops which compute and use the
        !            24: *  function N(w), which is the count of eigenvalues of a symmetric
        !            25: *  tridiagonal matrix T less than or equal to its argument  w.  It
        !            26: *  performs a choice of two types of loops:
        !            27: *
        !            28: *  IJOB=1, followed by
        !            29: *  IJOB=2: It takes as input a list of intervals and returns a list of
        !            30: *          sufficiently small intervals whose union contains the same
        !            31: *          eigenvalues as the union of the original intervals.
        !            32: *          The input intervals are (AB(j,1),AB(j,2)], j=1,...,MINP.
        !            33: *          The output interval (AB(j,1),AB(j,2)] will contain
        !            34: *          eigenvalues NAB(j,1)+1,...,NAB(j,2), where 1 <= j <= MOUT.
        !            35: *
        !            36: *  IJOB=3: It performs a binary search in each input interval
        !            37: *          (AB(j,1),AB(j,2)] for a point  w(j)  such that
        !            38: *          N(w(j))=NVAL(j), and uses  C(j)  as the starting point of
        !            39: *          the search.  If such a w(j) is found, then on output
        !            40: *          AB(j,1)=AB(j,2)=w.  If no such w(j) is found, then on output
        !            41: *          (AB(j,1),AB(j,2)] will be a small interval containing the
        !            42: *          point where N(w) jumps through NVAL(j), unless that point
        !            43: *          lies outside the initial interval.
        !            44: *
        !            45: *  Note that the intervals are in all cases half-open intervals,
        !            46: *  i.e., of the form  (a,b] , which includes  b  but not  a .
        !            47: *
        !            48: *  To avoid underflow, the matrix should be scaled so that its largest
        !            49: *  element is no greater than  overflow**(1/2) * underflow**(1/4)
        !            50: *  in absolute value.  To assure the most accurate computation
        !            51: *  of small eigenvalues, the matrix should be scaled to be
        !            52: *  not much smaller than that, either.
        !            53: *
        !            54: *  See W. Kahan "Accurate Eigenvalues of a Symmetric Tridiagonal
        !            55: *  Matrix", Report CS41, Computer Science Dept., Stanford
        !            56: *  University, July 21, 1966
        !            57: *
        !            58: *  Note: the arguments are, in general, *not* checked for unreasonable
        !            59: *  values.
        !            60: *
        !            61: *  Arguments
        !            62: *  =========
        !            63: *
        !            64: *  IJOB    (input) INTEGER
        !            65: *          Specifies what is to be done:
        !            66: *          = 1:  Compute NAB for the initial intervals.
        !            67: *          = 2:  Perform bisection iteration to find eigenvalues of T.
        !            68: *          = 3:  Perform bisection iteration to invert N(w), i.e.,
        !            69: *                to find a point which has a specified number of
        !            70: *                eigenvalues of T to its left.
        !            71: *          Other values will cause DLAEBZ to return with INFO=-1.
        !            72: *
        !            73: *  NITMAX  (input) INTEGER
        !            74: *          The maximum number of "levels" of bisection to be
        !            75: *          performed, i.e., an interval of width W will not be made
        !            76: *          smaller than 2^(-NITMAX) * W.  If not all intervals
        !            77: *          have converged after NITMAX iterations, then INFO is set
        !            78: *          to the number of non-converged intervals.
        !            79: *
        !            80: *  N       (input) INTEGER
        !            81: *          The dimension n of the tridiagonal matrix T.  It must be at
        !            82: *          least 1.
        !            83: *
        !            84: *  MMAX    (input) INTEGER
        !            85: *          The maximum number of intervals.  If more than MMAX intervals
        !            86: *          are generated, then DLAEBZ will quit with INFO=MMAX+1.
        !            87: *
        !            88: *  MINP    (input) INTEGER
        !            89: *          The initial number of intervals.  It may not be greater than
        !            90: *          MMAX.
        !            91: *
        !            92: *  NBMIN   (input) INTEGER
        !            93: *          The smallest number of intervals that should be processed
        !            94: *          using a vector loop.  If zero, then only the scalar loop
        !            95: *          will be used.
        !            96: *
        !            97: *  ABSTOL  (input) DOUBLE PRECISION
        !            98: *          The minimum (absolute) width of an interval.  When an
        !            99: *          interval is narrower than ABSTOL, or than RELTOL times the
        !           100: *          larger (in magnitude) endpoint, then it is considered to be
        !           101: *          sufficiently small, i.e., converged.  This must be at least
        !           102: *          zero.
        !           103: *
        !           104: *  RELTOL  (input) DOUBLE PRECISION
        !           105: *          The minimum relative width of an interval.  When an interval
        !           106: *          is narrower than ABSTOL, or than RELTOL times the larger (in
        !           107: *          magnitude) endpoint, then it is considered to be
        !           108: *          sufficiently small, i.e., converged.  Note: this should
        !           109: *          always be at least radix*machine epsilon.
        !           110: *
        !           111: *  PIVMIN  (input) DOUBLE PRECISION
        !           112: *          The minimum absolute value of a "pivot" in the Sturm
        !           113: *          sequence loop.  This *must* be at least  max |e(j)**2| *
        !           114: *          safe_min  and at least safe_min, where safe_min is at least
        !           115: *          the smallest number that can divide one without overflow.
        !           116: *
        !           117: *  D       (input) DOUBLE PRECISION array, dimension (N)
        !           118: *          The diagonal elements of the tridiagonal matrix T.
        !           119: *
        !           120: *  E       (input) DOUBLE PRECISION array, dimension (N)
        !           121: *          The offdiagonal elements of the tridiagonal matrix T in
        !           122: *          positions 1 through N-1.  E(N) is arbitrary.
        !           123: *
        !           124: *  E2      (input) DOUBLE PRECISION array, dimension (N)
        !           125: *          The squares of the offdiagonal elements of the tridiagonal
        !           126: *          matrix T.  E2(N) is ignored.
        !           127: *
        !           128: *  NVAL    (input/output) INTEGER array, dimension (MINP)
        !           129: *          If IJOB=1 or 2, not referenced.
        !           130: *          If IJOB=3, the desired values of N(w).  The elements of NVAL
        !           131: *          will be reordered to correspond with the intervals in AB.
        !           132: *          Thus, NVAL(j) on output will not, in general be the same as
        !           133: *          NVAL(j) on input, but it will correspond with the interval
        !           134: *          (AB(j,1),AB(j,2)] on output.
        !           135: *
        !           136: *  AB      (input/output) DOUBLE PRECISION array, dimension (MMAX,2)
        !           137: *          The endpoints of the intervals.  AB(j,1) is  a(j), the left
        !           138: *          endpoint of the j-th interval, and AB(j,2) is b(j), the
        !           139: *          right endpoint of the j-th interval.  The input intervals
        !           140: *          will, in general, be modified, split, and reordered by the
        !           141: *          calculation.
        !           142: *
        !           143: *  C       (input/output) DOUBLE PRECISION array, dimension (MMAX)
        !           144: *          If IJOB=1, ignored.
        !           145: *          If IJOB=2, workspace.
        !           146: *          If IJOB=3, then on input C(j) should be initialized to the
        !           147: *          first search point in the binary search.
        !           148: *
        !           149: *  MOUT    (output) INTEGER
        !           150: *          If IJOB=1, the number of eigenvalues in the intervals.
        !           151: *          If IJOB=2 or 3, the number of intervals output.
        !           152: *          If IJOB=3, MOUT will equal MINP.
        !           153: *
        !           154: *  NAB     (input/output) INTEGER array, dimension (MMAX,2)
        !           155: *          If IJOB=1, then on output NAB(i,j) will be set to N(AB(i,j)).
        !           156: *          If IJOB=2, then on input, NAB(i,j) should be set.  It must
        !           157: *             satisfy the condition:
        !           158: *             N(AB(i,1)) <= NAB(i,1) <= NAB(i,2) <= N(AB(i,2)),
        !           159: *             which means that in interval i only eigenvalues
        !           160: *             NAB(i,1)+1,...,NAB(i,2) will be considered.  Usually,
        !           161: *             NAB(i,j)=N(AB(i,j)), from a previous call to DLAEBZ with
        !           162: *             IJOB=1.
        !           163: *             On output, NAB(i,j) will contain
        !           164: *             max(na(k),min(nb(k),N(AB(i,j)))), where k is the index of
        !           165: *             the input interval that the output interval
        !           166: *             (AB(j,1),AB(j,2)] came from, and na(k) and nb(k) are the
        !           167: *             the input values of NAB(k,1) and NAB(k,2).
        !           168: *          If IJOB=3, then on output, NAB(i,j) contains N(AB(i,j)),
        !           169: *             unless N(w) > NVAL(i) for all search points  w , in which
        !           170: *             case NAB(i,1) will not be modified, i.e., the output
        !           171: *             value will be the same as the input value (modulo
        !           172: *             reorderings -- see NVAL and AB), or unless N(w) < NVAL(i)
        !           173: *             for all search points  w , in which case NAB(i,2) will
        !           174: *             not be modified.  Normally, NAB should be set to some
        !           175: *             distinctive value(s) before DLAEBZ is called.
        !           176: *
        !           177: *  WORK    (workspace) DOUBLE PRECISION array, dimension (MMAX)
        !           178: *          Workspace.
        !           179: *
        !           180: *  IWORK   (workspace) INTEGER array, dimension (MMAX)
        !           181: *          Workspace.
        !           182: *
        !           183: *  INFO    (output) INTEGER
        !           184: *          = 0:       All intervals converged.
        !           185: *          = 1--MMAX: The last INFO intervals did not converge.
        !           186: *          = MMAX+1:  More than MMAX intervals were generated.
        !           187: *
        !           188: *  Further Details
        !           189: *  ===============
        !           190: *
        !           191: *      This routine is intended to be called only by other LAPACK
        !           192: *  routines, thus the interface is less user-friendly.  It is intended
        !           193: *  for two purposes:
        !           194: *
        !           195: *  (a) finding eigenvalues.  In this case, DLAEBZ should have one or
        !           196: *      more initial intervals set up in AB, and DLAEBZ should be called
        !           197: *      with IJOB=1.  This sets up NAB, and also counts the eigenvalues.
        !           198: *      Intervals with no eigenvalues would usually be thrown out at
        !           199: *      this point.  Also, if not all the eigenvalues in an interval i
        !           200: *      are desired, NAB(i,1) can be increased or NAB(i,2) decreased.
        !           201: *      For example, set NAB(i,1)=NAB(i,2)-1 to get the largest
        !           202: *      eigenvalue.  DLAEBZ is then called with IJOB=2 and MMAX
        !           203: *      no smaller than the value of MOUT returned by the call with
        !           204: *      IJOB=1.  After this (IJOB=2) call, eigenvalues NAB(i,1)+1
        !           205: *      through NAB(i,2) are approximately AB(i,1) (or AB(i,2)) to the
        !           206: *      tolerance specified by ABSTOL and RELTOL.
        !           207: *
        !           208: *  (b) finding an interval (a',b'] containing eigenvalues w(f),...,w(l).
        !           209: *      In this case, start with a Gershgorin interval  (a,b).  Set up
        !           210: *      AB to contain 2 search intervals, both initially (a,b).  One
        !           211: *      NVAL element should contain  f-1  and the other should contain  l
        !           212: *      , while C should contain a and b, resp.  NAB(i,1) should be -1
        !           213: *      and NAB(i,2) should be N+1, to flag an error if the desired
        !           214: *      interval does not lie in (a,b).  DLAEBZ is then called with
        !           215: *      IJOB=3.  On exit, if w(f-1) < w(f), then one of the intervals --
        !           216: *      j -- will have AB(j,1)=AB(j,2) and NAB(j,1)=NAB(j,2)=f-1, while
        !           217: *      if, to the specified tolerance, w(f-k)=...=w(f+r), k > 0 and r
        !           218: *      >= 0, then the interval will have  N(AB(j,1))=NAB(j,1)=f-k and
        !           219: *      N(AB(j,2))=NAB(j,2)=f+r.  The cases w(l) < w(l+1) and
        !           220: *      w(l-r)=...=w(l+k) are handled similarly.
        !           221: *
        !           222: *  =====================================================================
        !           223: *
        !           224: *     .. Parameters ..
        !           225:       DOUBLE PRECISION   ZERO, TWO, HALF
        !           226:       PARAMETER          ( ZERO = 0.0D0, TWO = 2.0D0,
        !           227:      $                   HALF = 1.0D0 / TWO )
        !           228: *     ..
        !           229: *     .. Local Scalars ..
        !           230:       INTEGER            ITMP1, ITMP2, J, JI, JIT, JP, KF, KFNEW, KL,
        !           231:      $                   KLNEW
        !           232:       DOUBLE PRECISION   TMP1, TMP2
        !           233: *     ..
        !           234: *     .. Intrinsic Functions ..
        !           235:       INTRINSIC          ABS, MAX, MIN
        !           236: *     ..
        !           237: *     .. Executable Statements ..
        !           238: *
        !           239: *     Check for Errors
        !           240: *
        !           241:       INFO = 0
        !           242:       IF( IJOB.LT.1 .OR. IJOB.GT.3 ) THEN
        !           243:          INFO = -1
        !           244:          RETURN
        !           245:       END IF
        !           246: *
        !           247: *     Initialize NAB
        !           248: *
        !           249:       IF( IJOB.EQ.1 ) THEN
        !           250: *
        !           251: *        Compute the number of eigenvalues in the initial intervals.
        !           252: *
        !           253:          MOUT = 0
        !           254: *DIR$ NOVECTOR
        !           255:          DO 30 JI = 1, MINP
        !           256:             DO 20 JP = 1, 2
        !           257:                TMP1 = D( 1 ) - AB( JI, JP )
        !           258:                IF( ABS( TMP1 ).LT.PIVMIN )
        !           259:      $            TMP1 = -PIVMIN
        !           260:                NAB( JI, JP ) = 0
        !           261:                IF( TMP1.LE.ZERO )
        !           262:      $            NAB( JI, JP ) = 1
        !           263: *
        !           264:                DO 10 J = 2, N
        !           265:                   TMP1 = D( J ) - E2( J-1 ) / TMP1 - AB( JI, JP )
        !           266:                   IF( ABS( TMP1 ).LT.PIVMIN )
        !           267:      $               TMP1 = -PIVMIN
        !           268:                   IF( TMP1.LE.ZERO )
        !           269:      $               NAB( JI, JP ) = NAB( JI, JP ) + 1
        !           270:    10          CONTINUE
        !           271:    20       CONTINUE
        !           272:             MOUT = MOUT + NAB( JI, 2 ) - NAB( JI, 1 )
        !           273:    30    CONTINUE
        !           274:          RETURN
        !           275:       END IF
        !           276: *
        !           277: *     Initialize for loop
        !           278: *
        !           279: *     KF and KL have the following meaning:
        !           280: *        Intervals 1,...,KF-1 have converged.
        !           281: *        Intervals KF,...,KL  still need to be refined.
        !           282: *
        !           283:       KF = 1
        !           284:       KL = MINP
        !           285: *
        !           286: *     If IJOB=2, initialize C.
        !           287: *     If IJOB=3, use the user-supplied starting point.
        !           288: *
        !           289:       IF( IJOB.EQ.2 ) THEN
        !           290:          DO 40 JI = 1, MINP
        !           291:             C( JI ) = HALF*( AB( JI, 1 )+AB( JI, 2 ) )
        !           292:    40    CONTINUE
        !           293:       END IF
        !           294: *
        !           295: *     Iteration loop
        !           296: *
        !           297:       DO 130 JIT = 1, NITMAX
        !           298: *
        !           299: *        Loop over intervals
        !           300: *
        !           301:          IF( KL-KF+1.GE.NBMIN .AND. NBMIN.GT.0 ) THEN
        !           302: *
        !           303: *           Begin of Parallel Version of the loop
        !           304: *
        !           305:             DO 60 JI = KF, KL
        !           306: *
        !           307: *              Compute N(c), the number of eigenvalues less than c
        !           308: *
        !           309:                WORK( JI ) = D( 1 ) - C( JI )
        !           310:                IWORK( JI ) = 0
        !           311:                IF( WORK( JI ).LE.PIVMIN ) THEN
        !           312:                   IWORK( JI ) = 1
        !           313:                   WORK( JI ) = MIN( WORK( JI ), -PIVMIN )
        !           314:                END IF
        !           315: *
        !           316:                DO 50 J = 2, N
        !           317:                   WORK( JI ) = D( J ) - E2( J-1 ) / WORK( JI ) - C( JI )
        !           318:                   IF( WORK( JI ).LE.PIVMIN ) THEN
        !           319:                      IWORK( JI ) = IWORK( JI ) + 1
        !           320:                      WORK( JI ) = MIN( WORK( JI ), -PIVMIN )
        !           321:                   END IF
        !           322:    50          CONTINUE
        !           323:    60       CONTINUE
        !           324: *
        !           325:             IF( IJOB.LE.2 ) THEN
        !           326: *
        !           327: *              IJOB=2: Choose all intervals containing eigenvalues.
        !           328: *
        !           329:                KLNEW = KL
        !           330:                DO 70 JI = KF, KL
        !           331: *
        !           332: *                 Insure that N(w) is monotone
        !           333: *
        !           334:                   IWORK( JI ) = MIN( NAB( JI, 2 ),
        !           335:      $                          MAX( NAB( JI, 1 ), IWORK( JI ) ) )
        !           336: *
        !           337: *                 Update the Queue -- add intervals if both halves
        !           338: *                 contain eigenvalues.
        !           339: *
        !           340:                   IF( IWORK( JI ).EQ.NAB( JI, 2 ) ) THEN
        !           341: *
        !           342: *                    No eigenvalue in the upper interval:
        !           343: *                    just use the lower interval.
        !           344: *
        !           345:                      AB( JI, 2 ) = C( JI )
        !           346: *
        !           347:                   ELSE IF( IWORK( JI ).EQ.NAB( JI, 1 ) ) THEN
        !           348: *
        !           349: *                    No eigenvalue in the lower interval:
        !           350: *                    just use the upper interval.
        !           351: *
        !           352:                      AB( JI, 1 ) = C( JI )
        !           353:                   ELSE
        !           354:                      KLNEW = KLNEW + 1
        !           355:                      IF( KLNEW.LE.MMAX ) THEN
        !           356: *
        !           357: *                       Eigenvalue in both intervals -- add upper to
        !           358: *                       queue.
        !           359: *
        !           360:                         AB( KLNEW, 2 ) = AB( JI, 2 )
        !           361:                         NAB( KLNEW, 2 ) = NAB( JI, 2 )
        !           362:                         AB( KLNEW, 1 ) = C( JI )
        !           363:                         NAB( KLNEW, 1 ) = IWORK( JI )
        !           364:                         AB( JI, 2 ) = C( JI )
        !           365:                         NAB( JI, 2 ) = IWORK( JI )
        !           366:                      ELSE
        !           367:                         INFO = MMAX + 1
        !           368:                      END IF
        !           369:                   END IF
        !           370:    70          CONTINUE
        !           371:                IF( INFO.NE.0 )
        !           372:      $            RETURN
        !           373:                KL = KLNEW
        !           374:             ELSE
        !           375: *
        !           376: *              IJOB=3: Binary search.  Keep only the interval containing
        !           377: *                      w   s.t. N(w) = NVAL
        !           378: *
        !           379:                DO 80 JI = KF, KL
        !           380:                   IF( IWORK( JI ).LE.NVAL( JI ) ) THEN
        !           381:                      AB( JI, 1 ) = C( JI )
        !           382:                      NAB( JI, 1 ) = IWORK( JI )
        !           383:                   END IF
        !           384:                   IF( IWORK( JI ).GE.NVAL( JI ) ) THEN
        !           385:                      AB( JI, 2 ) = C( JI )
        !           386:                      NAB( JI, 2 ) = IWORK( JI )
        !           387:                   END IF
        !           388:    80          CONTINUE
        !           389:             END IF
        !           390: *
        !           391:          ELSE
        !           392: *
        !           393: *           End of Parallel Version of the loop
        !           394: *
        !           395: *           Begin of Serial Version of the loop
        !           396: *
        !           397:             KLNEW = KL
        !           398:             DO 100 JI = KF, KL
        !           399: *
        !           400: *              Compute N(w), the number of eigenvalues less than w
        !           401: *
        !           402:                TMP1 = C( JI )
        !           403:                TMP2 = D( 1 ) - TMP1
        !           404:                ITMP1 = 0
        !           405:                IF( TMP2.LE.PIVMIN ) THEN
        !           406:                   ITMP1 = 1
        !           407:                   TMP2 = MIN( TMP2, -PIVMIN )
        !           408:                END IF
        !           409: *
        !           410: *              A series of compiler directives to defeat vectorization
        !           411: *              for the next loop
        !           412: *
        !           413: *$PL$ CMCHAR=' '
        !           414: CDIR$          NEXTSCALAR
        !           415: C$DIR          SCALAR
        !           416: CDIR$          NEXT SCALAR
        !           417: CVD$L          NOVECTOR
        !           418: CDEC$          NOVECTOR
        !           419: CVD$           NOVECTOR
        !           420: *VDIR          NOVECTOR
        !           421: *VOCL          LOOP,SCALAR
        !           422: CIBM           PREFER SCALAR
        !           423: *$PL$ CMCHAR='*'
        !           424: *
        !           425:                DO 90 J = 2, N
        !           426:                   TMP2 = D( J ) - E2( J-1 ) / TMP2 - TMP1
        !           427:                   IF( TMP2.LE.PIVMIN ) THEN
        !           428:                      ITMP1 = ITMP1 + 1
        !           429:                      TMP2 = MIN( TMP2, -PIVMIN )
        !           430:                   END IF
        !           431:    90          CONTINUE
        !           432: *
        !           433:                IF( IJOB.LE.2 ) THEN
        !           434: *
        !           435: *                 IJOB=2: Choose all intervals containing eigenvalues.
        !           436: *
        !           437: *                 Insure that N(w) is monotone
        !           438: *
        !           439:                   ITMP1 = MIN( NAB( JI, 2 ),
        !           440:      $                    MAX( NAB( JI, 1 ), ITMP1 ) )
        !           441: *
        !           442: *                 Update the Queue -- add intervals if both halves
        !           443: *                 contain eigenvalues.
        !           444: *
        !           445:                   IF( ITMP1.EQ.NAB( JI, 2 ) ) THEN
        !           446: *
        !           447: *                    No eigenvalue in the upper interval:
        !           448: *                    just use the lower interval.
        !           449: *
        !           450:                      AB( JI, 2 ) = TMP1
        !           451: *
        !           452:                   ELSE IF( ITMP1.EQ.NAB( JI, 1 ) ) THEN
        !           453: *
        !           454: *                    No eigenvalue in the lower interval:
        !           455: *                    just use the upper interval.
        !           456: *
        !           457:                      AB( JI, 1 ) = TMP1
        !           458:                   ELSE IF( KLNEW.LT.MMAX ) THEN
        !           459: *
        !           460: *                    Eigenvalue in both intervals -- add upper to queue.
        !           461: *
        !           462:                      KLNEW = KLNEW + 1
        !           463:                      AB( KLNEW, 2 ) = AB( JI, 2 )
        !           464:                      NAB( KLNEW, 2 ) = NAB( JI, 2 )
        !           465:                      AB( KLNEW, 1 ) = TMP1
        !           466:                      NAB( KLNEW, 1 ) = ITMP1
        !           467:                      AB( JI, 2 ) = TMP1
        !           468:                      NAB( JI, 2 ) = ITMP1
        !           469:                   ELSE
        !           470:                      INFO = MMAX + 1
        !           471:                      RETURN
        !           472:                   END IF
        !           473:                ELSE
        !           474: *
        !           475: *                 IJOB=3: Binary search.  Keep only the interval
        !           476: *                         containing  w  s.t. N(w) = NVAL
        !           477: *
        !           478:                   IF( ITMP1.LE.NVAL( JI ) ) THEN
        !           479:                      AB( JI, 1 ) = TMP1
        !           480:                      NAB( JI, 1 ) = ITMP1
        !           481:                   END IF
        !           482:                   IF( ITMP1.GE.NVAL( JI ) ) THEN
        !           483:                      AB( JI, 2 ) = TMP1
        !           484:                      NAB( JI, 2 ) = ITMP1
        !           485:                   END IF
        !           486:                END IF
        !           487:   100       CONTINUE
        !           488:             KL = KLNEW
        !           489: *
        !           490: *           End of Serial Version of the loop
        !           491: *
        !           492:          END IF
        !           493: *
        !           494: *        Check for convergence
        !           495: *
        !           496:          KFNEW = KF
        !           497:          DO 110 JI = KF, KL
        !           498:             TMP1 = ABS( AB( JI, 2 )-AB( JI, 1 ) )
        !           499:             TMP2 = MAX( ABS( AB( JI, 2 ) ), ABS( AB( JI, 1 ) ) )
        !           500:             IF( TMP1.LT.MAX( ABSTOL, PIVMIN, RELTOL*TMP2 ) .OR.
        !           501:      $          NAB( JI, 1 ).GE.NAB( JI, 2 ) ) THEN
        !           502: *
        !           503: *              Converged -- Swap with position KFNEW,
        !           504: *                           then increment KFNEW
        !           505: *
        !           506:                IF( JI.GT.KFNEW ) THEN
        !           507:                   TMP1 = AB( JI, 1 )
        !           508:                   TMP2 = AB( JI, 2 )
        !           509:                   ITMP1 = NAB( JI, 1 )
        !           510:                   ITMP2 = NAB( JI, 2 )
        !           511:                   AB( JI, 1 ) = AB( KFNEW, 1 )
        !           512:                   AB( JI, 2 ) = AB( KFNEW, 2 )
        !           513:                   NAB( JI, 1 ) = NAB( KFNEW, 1 )
        !           514:                   NAB( JI, 2 ) = NAB( KFNEW, 2 )
        !           515:                   AB( KFNEW, 1 ) = TMP1
        !           516:                   AB( KFNEW, 2 ) = TMP2
        !           517:                   NAB( KFNEW, 1 ) = ITMP1
        !           518:                   NAB( KFNEW, 2 ) = ITMP2
        !           519:                   IF( IJOB.EQ.3 ) THEN
        !           520:                      ITMP1 = NVAL( JI )
        !           521:                      NVAL( JI ) = NVAL( KFNEW )
        !           522:                      NVAL( KFNEW ) = ITMP1
        !           523:                   END IF
        !           524:                END IF
        !           525:                KFNEW = KFNEW + 1
        !           526:             END IF
        !           527:   110    CONTINUE
        !           528:          KF = KFNEW
        !           529: *
        !           530: *        Choose Midpoints
        !           531: *
        !           532:          DO 120 JI = KF, KL
        !           533:             C( JI ) = HALF*( AB( JI, 1 )+AB( JI, 2 ) )
        !           534:   120    CONTINUE
        !           535: *
        !           536: *        If no more intervals to refine, quit.
        !           537: *
        !           538:          IF( KF.GT.KL )
        !           539:      $      GO TO 140
        !           540:   130 CONTINUE
        !           541: *
        !           542: *     Converged
        !           543: *
        !           544:   140 CONTINUE
        !           545:       INFO = MAX( KL+1-KF, 0 )
        !           546:       MOUT = KL
        !           547: *
        !           548:       RETURN
        !           549: *
        !           550: *     End of DLAEBZ
        !           551: *
        !           552:       END

CVSweb interface <joel.bertrand@systella.fr>