1 *> \brief \b DLARRD computes the eigenvalues of a symmetric tridiagonal matrix to suitable accuracy.
3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
9 *> Download DLARRD + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarrd.f">
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarrd.f">
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarrd.f">
21 * SUBROUTINE DLARRD( RANGE, ORDER, N, VL, VU, IL, IU, GERS,
22 * RELTOL, D, E, E2, PIVMIN, NSPLIT, ISPLIT,
23 * M, W, WERR, WL, WU, IBLOCK, INDEXW,
26 * .. Scalar Arguments ..
27 * CHARACTER ORDER, RANGE
28 * INTEGER IL, INFO, IU, M, N, NSPLIT
29 * DOUBLE PRECISION PIVMIN, RELTOL, VL, VU, WL, WU
31 * .. Array Arguments ..
32 * INTEGER IBLOCK( * ), INDEXW( * ),
33 * $ ISPLIT( * ), IWORK( * )
34 * DOUBLE PRECISION D( * ), E( * ), E2( * ),
35 * $ GERS( * ), W( * ), WERR( * ), WORK( * )
44 *> DLARRD computes the eigenvalues of a symmetric tridiagonal
45 *> matrix T to suitable accuracy. This is an auxiliary code to be
46 *> called from DSTEMR.
47 *> The user may ask for all eigenvalues, all eigenvalues
48 *> in the half-open interval (VL, VU], or the IL-th through IU-th
51 *> To avoid overflow, the matrix must be scaled so that its
52 *> largest element is no greater than overflow**(1/2) * underflow**(1/4) in absolute value, and for greatest
53 *> accuracy, it should not be much smaller than that.
55 *> See W. Kahan "Accurate Eigenvalues of a Symmetric Tridiagonal
56 *> Matrix", Report CS41, Computer Science Dept., Stanford
57 *> University, July 21, 1966.
65 *> RANGE is CHARACTER*1
66 *> = 'A': ("All") all eigenvalues will be found.
67 *> = 'V': ("Value") all eigenvalues in the half-open interval
68 *> (VL, VU] will be found.
69 *> = 'I': ("Index") the IL-th through IU-th eigenvalues (of the
70 *> entire matrix) will be found.
75 *> ORDER is CHARACTER*1
76 *> = 'B': ("By Block") the eigenvalues will be grouped by
77 *> split-off block (see IBLOCK, ISPLIT) and
78 *> ordered from smallest to largest within
80 *> = 'E': ("Entire matrix")
81 *> the eigenvalues for the entire matrix
82 *> will be ordered from smallest to
89 *> The order of the tridiagonal matrix T. N >= 0.
94 *> VL is DOUBLE PRECISION
95 *> If RANGE='V', the lower bound of the interval to
96 *> be searched for eigenvalues. Eigenvalues less than or equal
97 *> to VL, or greater than VU, will not be returned. VL < VU.
98 *> Not referenced if RANGE = 'A' or 'I'.
103 *> VU is DOUBLE PRECISION
104 *> If RANGE='V', the upper bound of the interval to
105 *> be searched for eigenvalues. Eigenvalues less than or equal
106 *> to VL, or greater than VU, will not be returned. VL < VU.
107 *> Not referenced if RANGE = 'A' or 'I'.
113 *> If RANGE='I', the index of the
114 *> smallest eigenvalue to be returned.
115 *> 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0.
116 *> Not referenced if RANGE = 'A' or 'V'.
122 *> If RANGE='I', the index of the
123 *> largest eigenvalue to be returned.
124 *> 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0.
125 *> Not referenced if RANGE = 'A' or 'V'.
130 *> GERS is DOUBLE PRECISION array, dimension (2*N)
131 *> The N Gerschgorin intervals (the i-th Gerschgorin interval
132 *> is (GERS(2*i-1), GERS(2*i)).
137 *> RELTOL is DOUBLE PRECISION
138 *> The minimum relative width of an interval. When an interval
139 *> is narrower than RELTOL times the larger (in
140 *> magnitude) endpoint, then it is considered to be
141 *> sufficiently small, i.e., converged. Note: this should
142 *> always be at least radix*machine epsilon.
147 *> D is DOUBLE PRECISION array, dimension (N)
148 *> The n diagonal elements of the tridiagonal matrix T.
153 *> E is DOUBLE PRECISION array, dimension (N-1)
154 *> The (n-1) off-diagonal elements of the tridiagonal matrix T.
159 *> E2 is DOUBLE PRECISION array, dimension (N-1)
160 *> The (n-1) squared off-diagonal elements of the tridiagonal matrix T.
165 *> PIVMIN is DOUBLE PRECISION
166 *> The minimum pivot allowed in the Sturm sequence for T.
172 *> The number of diagonal blocks in the matrix T.
178 *> ISPLIT is INTEGER array, dimension (N)
179 *> The splitting points, at which T breaks up into submatrices.
180 *> The first submatrix consists of rows/columns 1 to ISPLIT(1),
181 *> the second of rows/columns ISPLIT(1)+1 through ISPLIT(2),
182 *> etc., and the NSPLIT-th consists of rows/columns
183 *> ISPLIT(NSPLIT-1)+1 through ISPLIT(NSPLIT)=N.
184 *> (Only the first NSPLIT elements will actually be used, but
185 *> since the user cannot know a priori what value NSPLIT will
186 *> have, N words must be reserved for ISPLIT.)
192 *> The actual number of eigenvalues found. 0 <= M <= N.
193 *> (See also the description of INFO=2,3.)
198 *> W is DOUBLE PRECISION array, dimension (N)
199 *> On exit, the first M elements of W will contain the
200 *> eigenvalue approximations. DLARRD computes an interval
201 *> I_j = (a_j, b_j] that includes eigenvalue j. The eigenvalue
202 *> approximation is given as the interval midpoint
203 *> W(j)= ( a_j + b_j)/2. The corresponding error is bounded by
204 *> WERR(j) = abs( a_j - b_j)/2
209 *> WERR is DOUBLE PRECISION array, dimension (N)
210 *> The error bound on the corresponding eigenvalue approximation
216 *> WL is DOUBLE PRECISION
221 *> WU is DOUBLE PRECISION
222 *> The interval (WL, WU] contains all the wanted eigenvalues.
223 *> If RANGE='V', then WL=VL and WU=VU.
224 *> If RANGE='A', then WL and WU are the global Gerschgorin bounds
226 *> If RANGE='I', then WL and WU are computed by DLAEBZ from the
227 *> index range specified.
230 *> \param[out] IBLOCK
232 *> IBLOCK is INTEGER array, dimension (N)
233 *> At each row/column j where E(j) is zero or small, the
234 *> matrix T is considered to split into a block diagonal
235 *> matrix. On exit, if INFO = 0, IBLOCK(i) specifies to which
236 *> block (from 1 to the number of blocks) the eigenvalue W(i)
237 *> belongs. (DLARRD may use the remaining N-M elements as
241 *> \param[out] INDEXW
243 *> INDEXW is INTEGER array, dimension (N)
244 *> The indices of the eigenvalues within each block (submatrix);
245 *> for example, INDEXW(i)= j and IBLOCK(i)=k imply that the
246 *> i-th eigenvalue W(i) is the j-th eigenvalue in block k.
251 *> WORK is DOUBLE PRECISION array, dimension (4*N)
256 *> IWORK is INTEGER array, dimension (3*N)
262 *> = 0: successful exit
263 *> < 0: if INFO = -i, the i-th argument had an illegal value
264 *> > 0: some or all of the eigenvalues failed to converge or
265 *> were not computed:
266 *> =1 or 3: Bisection failed to converge for some
267 *> eigenvalues; these eigenvalues are flagged by a
268 *> negative block number. The effect is that the
269 *> eigenvalues may not be as accurate as the
270 *> absolute and relative tolerances. This is
271 *> generally caused by unexpectedly inaccurate
273 *> =2 or 3: RANGE='I' only: Not all of the eigenvalues
275 *> Effect: M < IU+1-IL
276 *> Cause: non-monotonic arithmetic, causing the
277 *> Sturm sequence to be non-monotonic.
278 *> Cure: recalculate, using RANGE='A', and pick
279 *> out eigenvalues IL:IU. In some cases,
280 *> increasing the PARAMETER "FUDGE" may
282 *> = 4: RANGE='I', and the Gershgorin interval
283 *> initially used was too small. No eigenvalues
285 *> Probable cause: your machine has sloppy
286 *> floating-point arithmetic.
287 *> Cure: Increase the PARAMETER "FUDGE",
288 *> recompile, and try again.
291 *> \par Internal Parameters:
292 * =========================
295 *> FUDGE DOUBLE PRECISION, default = 2
296 *> A "fudge factor" to widen the Gershgorin intervals. Ideally,
297 *> a value of 1 should work, but on machines with sloppy
298 *> arithmetic, this needs to be larger. The default for
299 *> publicly released versions should be large enough to handle
300 *> the worst machine around. Note that this has no effect
301 *> on accuracy of the solution.
304 *> \par Contributors:
307 *> W. Kahan, University of California, Berkeley, USA \n
308 *> Beresford Parlett, University of California, Berkeley, USA \n
309 *> Jim Demmel, University of California, Berkeley, USA \n
310 *> Inderjit Dhillon, University of Texas, Austin, USA \n
311 *> Osni Marques, LBNL/NERSC, USA \n
312 *> Christof Voemel, University of California, Berkeley, USA \n
317 *> \author Univ. of Tennessee
318 *> \author Univ. of California Berkeley
319 *> \author Univ. of Colorado Denver
324 *> \ingroup auxOTHERauxiliary
326 * =====================================================================
327 SUBROUTINE DLARRD( RANGE, ORDER, N, VL, VU, IL, IU, GERS,
328 $ RELTOL, D, E, E2, PIVMIN, NSPLIT, ISPLIT,
329 $ M, W, WERR, WL, WU, IBLOCK, INDEXW,
330 $ WORK, IWORK, INFO )
332 * -- LAPACK auxiliary routine (version 3.6.1) --
333 * -- LAPACK is a software package provided by Univ. of Tennessee, --
334 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
337 * .. Scalar Arguments ..
338 CHARACTER ORDER, RANGE
339 INTEGER IL, INFO, IU, M, N, NSPLIT
340 DOUBLE PRECISION PIVMIN, RELTOL, VL, VU, WL, WU
342 * .. Array Arguments ..
343 INTEGER IBLOCK( * ), INDEXW( * ),
344 $ ISPLIT( * ), IWORK( * )
345 DOUBLE PRECISION D( * ), E( * ), E2( * ),
346 $ GERS( * ), W( * ), WERR( * ), WORK( * )
349 * =====================================================================
352 DOUBLE PRECISION ZERO, ONE, TWO, HALF, FUDGE
353 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0,
354 $ TWO = 2.0D0, HALF = ONE/TWO,
356 INTEGER ALLRNG, VALRNG, INDRNG
357 PARAMETER ( ALLRNG = 1, VALRNG = 2, INDRNG = 3 )
359 * .. Local Scalars ..
360 LOGICAL NCNVRG, TOOFEW
361 INTEGER I, IB, IBEGIN, IDISCL, IDISCU, IE, IEND, IINFO,
362 $ IM, IN, IOFF, IOUT, IRANGE, ITMAX, ITMP1,
363 $ ITMP2, IW, IWOFF, J, JBLK, JDISC, JE, JEE, NB,
365 DOUBLE PRECISION ATOLI, EPS, GL, GU, RTOLI, TMP1, TMP2,
366 $ TNORM, UFLOW, WKILL, WLU, WUL
372 * .. External Functions ..
375 DOUBLE PRECISION DLAMCH
376 EXTERNAL LSAME, ILAENV, DLAMCH
378 * .. External Subroutines ..
381 * .. Intrinsic Functions ..
382 INTRINSIC ABS, INT, LOG, MAX, MIN
384 * .. Executable Statements ..
390 IF( LSAME( RANGE, 'A' ) ) THEN
392 ELSE IF( LSAME( RANGE, 'V' ) ) THEN
394 ELSE IF( LSAME( RANGE, 'I' ) ) THEN
402 IF( IRANGE.LE.0 ) THEN
404 ELSE IF( .NOT.(LSAME(ORDER,'B').OR.LSAME(ORDER,'E')) ) THEN
406 ELSE IF( N.LT.0 ) THEN
408 ELSE IF( IRANGE.EQ.VALRNG ) THEN
411 ELSE IF( IRANGE.EQ.INDRNG .AND.
412 $ ( IL.LT.1 .OR. IL.GT.MAX( 1, N ) ) ) THEN
414 ELSE IF( IRANGE.EQ.INDRNG .AND.
415 $ ( IU.LT.MIN( N, IL ) .OR. IU.GT.N ) ) THEN
423 * Initialize error flags
428 * Quick return if possible
433 IF( IRANGE.EQ.INDRNG .AND. IL.EQ.1 .AND. IU.EQ.N ) IRANGE = 1
435 * Get machine constants
437 UFLOW = DLAMCH( 'U' )
440 * Special Case when N=1
441 * Treat case of 1x1 matrix for quick return
443 IF( (IRANGE.EQ.ALLRNG).OR.
444 $ ((IRANGE.EQ.VALRNG).AND.(D(1).GT.VL).AND.(D(1).LE.VU)).OR.
445 $ ((IRANGE.EQ.INDRNG).AND.(IL.EQ.1).AND.(IU.EQ.1)) ) THEN
448 * The computation error of the eigenvalue is zero
456 * NB is the minimum vector length for vector bisection, or 0
457 * if only scalar is to be done.
458 NB = ILAENV( 1, 'DSTEBZ', ' ', N, -1, -1, -1 )
461 * Find global spectral radius
465 GL = MIN( GL, GERS( 2*I - 1))
466 GU = MAX( GU, GERS(2*I) )
468 * Compute global Gerschgorin bounds and spectral diameter
469 TNORM = MAX( ABS( GL ), ABS( GU ) )
470 GL = GL - FUDGE*TNORM*EPS*N - FUDGE*TWO*PIVMIN
471 GU = GU + FUDGE*TNORM*EPS*N + FUDGE*TWO*PIVMIN
472 * [JAN/28/2009] remove the line below since SPDIAM variable not use
474 * Input arguments for DLAEBZ:
475 * The relative tolerance. An interval (a,b] lies within
476 * "relative tolerance" if b-a < RELTOL*max(|a|,|b|),
478 * Set the absolute tolerance for interval convergence to zero to force
479 * interval convergence based on relative size of the interval.
480 * This is dangerous because intervals might not converge when RELTOL is
481 * small. But at least a very small number should be selected so that for
482 * strongly graded matrices, the code can get relatively accurate
484 ATOLI = FUDGE*TWO*UFLOW + FUDGE*TWO*PIVMIN
486 IF( IRANGE.EQ.INDRNG ) THEN
488 * RANGE='I': Compute an interval containing eigenvalues
489 * IL through IU. The initial interval [GL,GU] from the global
490 * Gerschgorin bounds GL and GU is refined by DLAEBZ.
491 ITMAX = INT( ( LOG( TNORM+PIVMIN )-LOG( PIVMIN ) ) /
506 CALL DLAEBZ( 3, ITMAX, N, 2, 2, NB, ATOLI, RTOLI, PIVMIN,
507 $ D, E, E2, IWORK( 5 ), WORK( N+1 ), WORK( N+5 ), IOUT,
508 $ IWORK, W, IBLOCK, IINFO )
509 IF( IINFO .NE. 0 ) THEN
513 * On exit, output intervals may not be ordered by ascending negcount
514 IF( IWORK( 6 ).EQ.IU ) THEN
529 * On exit, the interval [WL, WLU] contains a value with negcount NWL,
530 * and [WUL, WU] contains a value with negcount NWU.
531 IF( NWL.LT.0 .OR. NWL.GE.N .OR. NWU.LT.1 .OR. NWU.GT.N ) THEN
536 ELSEIF( IRANGE.EQ.VALRNG ) THEN
540 ELSEIF( IRANGE.EQ.ALLRNG ) THEN
547 * Find Eigenvalues -- Loop Over blocks and recompute NWL and NWU.
548 * NWL accumulates the number of eigenvalues .le. WL,
549 * NWU accumulates the number of eigenvalues .le. WU
556 DO 70 JBLK = 1, NSPLIT
559 IEND = ISPLIT( JBLK )
564 IF( WL.GE.D( IBEGIN )-PIVMIN )
566 IF( WU.GE.D( IBEGIN )-PIVMIN )
568 IF( IRANGE.EQ.ALLRNG .OR.
569 $ ( WL.LT.D( IBEGIN )-PIVMIN
570 $ .AND. WU.GE. D( IBEGIN )-PIVMIN ) ) THEN
574 * The gap for a single block doesn't matter for the later
575 * algorithm and is assigned an arbitrary large value
580 * Disabled 2x2 case because of a failure on the following matrix
581 * RANGE = 'I', IL = IU = 4
582 * Original Tridiagonal, d = [
583 * -0.150102010615740E+00
584 * -0.849897989384260E+00
585 * -0.128208148052635E-15
586 * 0.128257718286320E-15
589 * -0.357171383266986E+00
590 * -0.180411241501588E-15
591 * -0.175152352710251E-15
594 * ELSE IF( IN.EQ.2 ) THEN
596 * DISC = SQRT( (HALF*(D(IBEGIN)-D(IEND)))**2 + E(IBEGIN)**2 )
597 * TMP1 = HALF*(D(IBEGIN)+D(IEND))
599 * IF( WL.GE. L1-PIVMIN )
601 * IF( WU.GE. L1-PIVMIN )
603 * IF( IRANGE.EQ.ALLRNG .OR. ( WL.LT.L1-PIVMIN .AND. WU.GE.
604 * $ L1-PIVMIN ) ) THEN
607 ** The uncertainty of eigenvalues of a 2x2 matrix is very small
608 * WERR( M ) = EPS * ABS( W( M ) ) * TWO
613 * IF( WL.GE. L2-PIVMIN )
615 * IF( WU.GE. L2-PIVMIN )
617 * IF( IRANGE.EQ.ALLRNG .OR. ( WL.LT.L2-PIVMIN .AND. WU.GE.
618 * $ L2-PIVMIN ) ) THEN
621 ** The uncertainty of eigenvalues of a 2x2 matrix is very small
622 * WERR( M ) = EPS * ABS( W( M ) ) * TWO
627 * General Case - block of size IN >= 2
628 * Compute local Gerschgorin interval and use it as the initial
629 * interval for DLAEBZ
634 DO 40 J = IBEGIN, IEND
635 GL = MIN( GL, GERS( 2*J - 1))
636 GU = MAX( GU, GERS(2*J) )
639 * change SPDIAM by TNORM in lines 2 and 3 thereafter
640 * line 1: remove computation of SPDIAM (not useful anymore)
642 * GL = GL - FUDGE*SPDIAM*EPS*IN - FUDGE*PIVMIN
643 * GU = GU + FUDGE*SPDIAM*EPS*IN + FUDGE*PIVMIN
644 GL = GL - FUDGE*TNORM*EPS*IN - FUDGE*PIVMIN
645 GU = GU + FUDGE*TNORM*EPS*IN + FUDGE*PIVMIN
647 IF( IRANGE.GT.1 ) THEN
649 * the local block contains none of the wanted eigenvalues
654 * refine search interval if possible, only range (WL,WU] matters
661 * Find negcount of initial interval boundaries GL and GU
664 CALL DLAEBZ( 1, 0, IN, IN, 1, NB, ATOLI, RTOLI, PIVMIN,
665 $ D( IBEGIN ), E( IBEGIN ), E2( IBEGIN ),
666 $ IDUMMA, WORK( N+1 ), WORK( N+2*IN+1 ), IM,
667 $ IWORK, W( M+1 ), IBLOCK( M+1 ), IINFO )
668 IF( IINFO .NE. 0 ) THEN
673 NWL = NWL + IWORK( 1 )
674 NWU = NWU + IWORK( IN+1 )
675 IWOFF = M - IWORK( 1 )
677 * Compute Eigenvalues
678 ITMAX = INT( ( LOG( GU-GL+PIVMIN )-LOG( PIVMIN ) ) /
680 CALL DLAEBZ( 2, ITMAX, IN, IN, 1, NB, ATOLI, RTOLI, PIVMIN,
681 $ D( IBEGIN ), E( IBEGIN ), E2( IBEGIN ),
682 $ IDUMMA, WORK( N+1 ), WORK( N+2*IN+1 ), IOUT,
683 $ IWORK, W( M+1 ), IBLOCK( M+1 ), IINFO )
684 IF( IINFO .NE. 0 ) THEN
689 * Copy eigenvalues into W and IBLOCK
690 * Use -JBLK for block number for unconverged eigenvalues.
691 * Loop over the number of output intervals from DLAEBZ
693 * eigenvalue approximation is middle point of interval
694 TMP1 = HALF*( WORK( J+N )+WORK( J+IN+N ) )
695 * semi length of error interval
696 TMP2 = HALF*ABS( WORK( J+N )-WORK( J+IN+N ) )
697 IF( J.GT.IOUT-IINFO ) THEN
698 * Flag non-convergence.
704 DO 50 JE = IWORK( J ) + 1 + IWOFF,
705 $ IWORK( J+IN ) + IWOFF
708 INDEXW( JE ) = JE - IWOFF
717 * If RANGE='I', then (WL,WU) contains eigenvalues NWL+1,...,NWU
718 * If NWL+1 < IL or NWU > IU, discard extra eigenvalues.
719 IF( IRANGE.EQ.INDRNG ) THEN
720 IDISCL = IL - 1 - NWL
723 IF( IDISCL.GT.0 ) THEN
726 * Remove some of the smallest eigenvalues from the left so that
727 * at the end IDISCL =0. Move all eigenvalues up to the left.
728 IF( W( JE ).LE.WLU .AND. IDISCL.GT.0 ) THEN
733 WERR( IM ) = WERR( JE )
734 INDEXW( IM ) = INDEXW( JE )
735 IBLOCK( IM ) = IBLOCK( JE )
740 IF( IDISCU.GT.0 ) THEN
741 * Remove some of the largest eigenvalues from the right so that
742 * at the end IDISCU =0. Move all eigenvalues up to the left.
745 IF( W( JE ).GE.WUL .AND. IDISCU.GT.0 ) THEN
750 WERR( IM ) = WERR( JE )
751 INDEXW( IM ) = INDEXW( JE )
752 IBLOCK( IM ) = IBLOCK( JE )
759 WERR( JEE ) = WERR( JE )
760 INDEXW( JEE ) = INDEXW( JE )
761 IBLOCK( JEE ) = IBLOCK( JE )
766 IF( IDISCL.GT.0 .OR. IDISCU.GT.0 ) THEN
767 * Code to deal with effects of bad arithmetic. (If N(w) is
768 * monotone non-decreasing, this should never happen.)
769 * Some low eigenvalues to be discarded are not in (WL,WLU],
770 * or high eigenvalues to be discarded are not in (WUL,WU]
771 * so just kill off the smallest IDISCL/largest IDISCU
772 * eigenvalues, by marking the corresponding IBLOCK = 0
773 IF( IDISCL.GT.0 ) THEN
775 DO 100 JDISC = 1, IDISCL
778 IF( IBLOCK( JE ).NE.0 .AND.
779 $ ( W( JE ).LT.WKILL .OR. IW.EQ.0 ) ) THEN
787 IF( IDISCU.GT.0 ) THEN
789 DO 120 JDISC = 1, IDISCU
792 IF( IBLOCK( JE ).NE.0 .AND.
793 $ ( W( JE ).GE.WKILL .OR. IW.EQ.0 ) ) THEN
801 * Now erase all eigenvalues with IBLOCK set to zero
804 IF( IBLOCK( JE ).NE.0 ) THEN
807 WERR( IM ) = WERR( JE )
808 INDEXW( IM ) = INDEXW( JE )
809 IBLOCK( IM ) = IBLOCK( JE )
814 IF( IDISCL.LT.0 .OR. IDISCU.LT.0 ) THEN
819 IF(( IRANGE.EQ.ALLRNG .AND. M.NE.N ).OR.
820 $ ( IRANGE.EQ.INDRNG .AND. M.NE.IU-IL+1 ) ) THEN
824 * If ORDER='B', do nothing the eigenvalues are already sorted by
826 * If ORDER='E', sort the eigenvalues from smallest to largest
828 IF( LSAME(ORDER,'E') .AND. NSPLIT.GT.1 ) THEN
833 IF( W( J ).LT.TMP1 ) THEN
843 WERR( IE ) = WERR( JE )
844 IBLOCK( IE ) = IBLOCK( JE )
845 INDEXW( IE ) = INDEXW( JE )