281 SUBROUTINE clarrv( N, VL, VU, D, L, PIVMIN,
282 $ ISPLIT, M, DOL, DOU, MINRGP,
283 $ RTOL1, RTOL2, W, WERR, WGAP,
284 $ IBLOCK, INDEXW, GERS, Z, LDZ, ISUPPZ,
285 $ WORK, IWORK, INFO )
292 INTEGER DOL, DOU, INFO, LDZ, M, N
293 REAL MINRGP, PIVMIN, RTOL1, RTOL2, VL, VU
296 INTEGER IBLOCK( * ), INDEXW( * ), ISPLIT( * ),
297 $ isuppz( * ), iwork( * )
298 REAL D( * ), GERS( * ), L( * ), ( * ), WERR( * ),
299 $ WGAP( * ), WORK( * )
307 PARAMETER ( MAXITR = 10 )
309 parameter( czero = ( 0.0e0, 0.0e0 ) )
310 REAL ZERO, , TWO, THREE, FOUR, HALF
311 parameter( zero = 0.0e0, one = 1.0e0,
312 $ two = 2.0e0, three = 3.0e0,
313 $ four = 4.0e0, half = 0.5e0)
316 LOGICAL ESKIP, NEEDBS, STP2II, TRYRQC, USEDBS, USEDRQ
317 INTEGER DONE, I, IBEGIN, IDONE, IEND, II, IINDC1,
318 $ IINDC2, IINDR, IINDWK, IINFO, IM, IN, INDEIG,
319 $ INDLD, INDLLD, INDWRK, ISUPMN, ISUPMX, ITER,
320 $ itmp1, j, jblk, k, miniwsize, minwsize, nclus,
321 $ ndepth, negcnt, newcls, newfst, newftt, newlst,
322 $ newsiz, offset, oldcls, oldfst, oldien, oldlst,
323 $ oldncl, p, parity, q, wbegin, wend, windex,
324 $ windmn, windpl, zfrom, zto, zusedl, zusedu,
326 INTEGER INDIN1, INDIN2
327 REAL BSTRES, BSTW, EPS, FUDGE, GAP, GAPTOL, GL, GU,
328 $ LAMBDA, LEFT, LGAP, MINGMA, NRMINV, RESID,
329 $ RGAP, RIGHT, RQCORR, RQTOL, SAVGAP, SGNDEF,
330 $ sigma, spdiam, ssigma, tau, tmp, tol, ztz
341 INTRINSIC abs, real,
max,
min
351 IF( (n.LE.0).OR.(m.LE.0) )
THEN
392 zusedw = zusedu - zusedl + 1
395 CALL claset(
'Full', n, zusedw, czero, czero,
398 eps = slamch( 'precision
' )
404.EQ..AND..EQ.
IF((DOL1)(DOUM)) THEN
423 DO 170 JBLK = 1, IBLOCK( M )
424 IEND = ISPLIT( JBLK )
431.EQ.
IF( IBLOCK( WEND+1 )JBLK ) THEN
436.LT.
IF( WENDWBEGIN ) THEN
439.LT..OR..GT.
ELSEIF( (WENDDOL)(WBEGINDOU) ) THEN
446 GL = GERS( 2*IBEGIN-1 )
447 GU = GERS( 2*IBEGIN )
448 DO 20 I = IBEGIN+1 , IEND
449 GL = MIN( GERS( 2*I-1 ), GL )
450 GU = MAX( GERS( 2*I ), GU )
457 IN = IEND - IBEGIN + 1
459 IM = WEND - WBEGIN + 1
462.EQ.
IF( IBEGINIEND ) THEN
464 Z( IBEGIN, WBEGIN ) = CMPLX( ONE, ZERO )
465 ISUPPZ( 2*WBEGIN-1 ) = IBEGIN
466 ISUPPZ( 2*WBEGIN ) = IBEGIN
467 W( WBEGIN ) = W( WBEGIN ) + SIGMA
468 WORK( WBEGIN ) = W( WBEGIN )
480 CALL SCOPY( IM, W( WBEGIN ), 1,
481 $ WORK( WBEGIN ), 1 )
486 W(WBEGIN+I-1) = W(WBEGIN+I-1)+SIGMA
497 IWORK( IINDC1+1 ) = 1
498 IWORK( IINDC1+2 ) = IM
507.LT.
IF( IDONEIM ) THEN
509.GT.
IF( NDEPTHM ) THEN
520.EQ.
IF( PARITY0 ) THEN
533 OLDFST = IWORK( J-1 )
535.GT.
IF( NDEPTH0 ) THEN
541.EQ..AND..EQ.
IF((DOL1)(DOUM)) THEN
544 J = WBEGIN + OLDFST - 1
546.LT.
IF(WBEGIN+OLDFST-1DOL) THEN
549.GT.
ELSEIF(WBEGIN+OLDFST-1DOU) THEN
553 J = WBEGIN + OLDFST - 1
557 D( IBEGIN+K-1 ) = REAL( Z( IBEGIN+K-1,
559 L( IBEGIN+K-1 ) = REAL( Z( IBEGIN+K-1,
562 D( IEND ) = REAL( Z( IEND, J ) )
563 SIGMA = REAL( Z( IEND, J+1 ) )
566 CALL CLASET( 'full
', IN, 2, CZERO, CZERO,
567 $ Z( IBEGIN, J), LDZ )
571 DO 50 J = IBEGIN, IEND-1
573 WORK( INDLD-1+J ) = TMP
574 WORK( INDLLD-1+J ) = TMP*L( J )
577.GT.
IF( NDEPTH0 ) THEN
580 P = INDEXW( WBEGIN-1+OLDFST )
581 Q = INDEXW( WBEGIN-1+OLDLST )
585 OFFSET = INDEXW( WBEGIN ) - 1
588 CALL SLARRB( IN, D( IBEGIN ),
589 $ WORK(INDLLD+IBEGIN-1),
590 $ P, Q, RTOL1, RTOL2, OFFSET,
591 $ WORK(WBEGIN),WGAP(WBEGIN),WERR(WBEGIN),
592 $ WORK( INDWRK ), IWORK( IINDWK ),
593 $ PIVMIN, SPDIAM, IN, IINFO )
594.NE.
IF( IINFO0 ) THEN
605.GT.
IF( OLDFST1) THEN
606 WGAP( WBEGIN+OLDFST-2 ) =
607 $ MAX(WGAP(WBEGIN+OLDFST-2),
608 $ W(WBEGIN+OLDFST-1)-WERR(WBEGIN+OLDFST-1)
609 $ - W(WBEGIN+OLDFST-2)-WERR(WBEGIN+OLDFST-2) )
611.LT.
IF( WBEGIN + OLDLST -1 WEND ) THEN
612 WGAP( WBEGIN+OLDLST-1 ) =
613 $ MAX(WGAP(WBEGIN+OLDLST-1),
614 $ W(WBEGIN+OLDLST)-WERR(WBEGIN+OLDLST)
615 $ - W(WBEGIN+OLDLST-1)-WERR(WBEGIN+OLDLST-1) )
619 DO 53 J=OLDFST,OLDLST
620 W(WBEGIN+J-1) = WORK(WBEGIN+J-1)+SIGMA
626 DO 140 J = OLDFST, OLDLST
627.EQ.
IF( JOLDLST ) THEN
631.GE.
ELSE IF ( WGAP( WBEGIN + J -1)
632 $ MINRGP* ABS( WORK(WBEGIN + J -1) ) ) THEN
643 NEWSIZ = NEWLST - NEWFST + 1
647.EQ..AND..EQ.
IF((DOL1)(DOUM)) THEN
650 NEWFTT = WBEGIN + NEWFST - 1
652.LT.
IF(WBEGIN+NEWFST-1DOL) THEN
655.GT.
ELSEIF(WBEGIN+NEWFST-1DOU) THEN
659 NEWFTT = WBEGIN + NEWFST - 1
663.GT.
IF( NEWSIZ1) THEN
678.EQ.
IF( NEWFST1 ) THEN
680 $ W(WBEGIN)-WERR(WBEGIN) - VL )
682 LGAP = WGAP( WBEGIN+NEWFST-2 )
684 RGAP = WGAP( WBEGIN+NEWLST-1 )
693 P = INDEXW( WBEGIN-1+NEWFST )
695 P = INDEXW( WBEGIN-1+NEWLST )
697 OFFSET = INDEXW( WBEGIN ) - 1
698 CALL SLARRB( IN, D(IBEGIN),
699 $ WORK( INDLLD+IBEGIN-1 ),P,P,
700 $ RQTOL, RQTOL, OFFSET,
701 $ WORK(WBEGIN),WGAP(WBEGIN),
702 $ WERR(WBEGIN),WORK( INDWRK ),
703 $ IWORK( IINDWK ), PIVMIN, SPDIAM,
707.LT..OR.
IF((WBEGIN+NEWLST-1DOL)
708.GT.
$ (WBEGIN+NEWFST-1DOU)) THEN
716 IDONE = IDONE + NEWLST - NEWFST + 1
724 CALL SLARRF( IN, D( IBEGIN ), L( IBEGIN ),
725 $ WORK(INDLD+IBEGIN-1),
726 $ NEWFST, NEWLST, WORK(WBEGIN),
727 $ WGAP(WBEGIN), WERR(WBEGIN),
728 $ SPDIAM, LGAP, RGAP, PIVMIN, TAU,
729 $ WORK( INDIN1 ), WORK( INDIN2 ),
730 $ WORK( INDWRK ), IINFO )
735 Z( IBEGIN+K-1, NEWFTT ) =
736 $ CMPLX( WORK( INDIN1+K-1 ), ZERO )
737 Z( IBEGIN+K-1, NEWFTT+1 ) =
738 $ CMPLX( WORK( INDIN2+K-1 ), ZERO )
741 $ CMPLX( WORK( INDIN1+IN-1 ), ZERO )
742.EQ.
IF( IINFO0 ) THEN
746 Z( IEND, NEWFTT+1 ) = CMPLX( SSIGMA, ZERO )
749 DO 116 K = NEWFST, NEWLST
751 $ THREE*EPS*ABS(WORK(WBEGIN+K-1))
752 WORK( WBEGIN + K - 1 ) =
753 $ WORK( WBEGIN + K - 1) - TAU
755 $ FOUR*EPS*ABS(WORK(WBEGIN+K-1))
757 WERR( WBEGIN + K - 1 ) =
758 $ WERR( WBEGIN + K - 1 ) + FUDGE
770 IWORK( K-1 ) = NEWFST
782 TOL = FOUR * LOG(REAL(IN)) * EPS
785 WINDEX = WBEGIN + K - 1
786 WINDMN = MAX(WINDEX - 1,1)
787 WINDPL = MIN(WINDEX + 1,M)
788 LAMBDA = WORK( WINDEX )
791.LT..OR.
IF((WINDEXDOL)
792.GT.
$ (WINDEXDOU)) THEN
798 LEFT = WORK( WINDEX ) - WERR( WINDEX )
799 RIGHT = WORK( WINDEX ) + WERR( WINDEX )
800 INDEIG = INDEXW( WINDEX )
815 LGAP = EPS*MAX(ABS(LEFT),ABS(RIGHT))
825 RGAP = EPS*MAX(ABS(LEFT),ABS(RIGHT))
829 GAP = MIN( LGAP, RGAP )
830.EQ..OR..EQ.
IF(( K 1)(K IM)) THEN
845 SAVGAP = WGAP(WINDEX)
862 ITMP1 = IWORK( IINDR+WINDEX )
863 OFFSET = INDEXW( WBEGIN ) - 1
864 CALL SLARRB( IN, D(IBEGIN),
865 $ WORK(INDLLD+IBEGIN-1),INDEIG,INDEIG,
866 $ ZERO, TWO*EPS, OFFSET,
867 $ WORK(WBEGIN),WGAP(WBEGIN),
868 $ WERR(WBEGIN),WORK( INDWRK ),
869 $ IWORK( IINDWK ), PIVMIN, SPDIAM,
871.NE.
IF( IINFO0 ) THEN
875 LAMBDA = WORK( WINDEX )
878 IWORK( IINDR+WINDEX ) = 0
881 CALL CLAR1V( IN, 1, IN, LAMBDA, D( IBEGIN ),
882 $ L( IBEGIN ), WORK(INDLD+IBEGIN-1),
883 $ WORK(INDLLD+IBEGIN-1),
884 $ PIVMIN, GAPTOL, Z( IBEGIN, WINDEX ),
885.NOT.
$ USEDBS, NEGCNT, ZTZ, MINGMA,
886 $ IWORK( IINDR+WINDEX ), ISUPPZ( 2*WINDEX-1 ),
887 $ NRMINV, RESID, RQCORR, WORK( INDWRK ) )
891.LT.
ELSEIF(RESIDBSTRES) THEN
895 ISUPMN = MIN(ISUPMN,ISUPPZ( 2*WINDEX-1 ))
896 ISUPMX = MAX(ISUPMX,ISUPPZ( 2*WINDEX ))
908.GT..AND..GT.
IF( RESIDTOL*GAP ABS( RQCORR )
909.AND..NOT.
$ RQTOL*ABS( LAMBDA ) USEDBS)
914.LE.
IF(INDEIGNEGCNT) THEN
923.GE.
IF( ( RQCORR*SGNDEFZERO )
924.AND..LE.
$ ( LAMBDA + RQCORR RIGHT)
925.AND..GE.
$ ( LAMBDA + RQCORR LEFT)
929.EQ.
IF(SGNDEFONE) THEN
948 $ HALF * (RIGHT + LEFT)
951 LAMBDA = LAMBDA + RQCORR
954 $ HALF * (RIGHT-LEFT)
958.LT.
IF(RIGHT-LEFTRQTOL*ABS(LAMBDA)) THEN
963.LT.
ELSEIF( ITERMAXITR ) THEN
965.EQ.
ELSEIF( ITERMAXITR ) THEN
974.AND..AND.
IF(USEDRQ USEDBS
975.LE.
$ BSTRESRESID) THEN
981 CALL CLAR1V( IN, 1, IN, LAMBDA,
982 $ D( IBEGIN ), L( IBEGIN ),
983 $ WORK(INDLD+IBEGIN-1),
984 $ WORK(INDLLD+IBEGIN-1),
985 $ PIVMIN, GAPTOL, Z( IBEGIN, WINDEX ),
986.NOT.
$ USEDBS, NEGCNT, ZTZ, MINGMA,
987 $ IWORK( IINDR+WINDEX ),
988 $ ISUPPZ( 2*WINDEX-1 ),
989 $ NRMINV, RESID, RQCORR, WORK( INDWRK ) )
991 WORK( WINDEX ) = LAMBDA
996 ISUPPZ( 2*WINDEX-1 ) = ISUPPZ( 2*WINDEX-1 )+OLDIEN
997 ISUPPZ( 2*WINDEX ) = ISUPPZ( 2*WINDEX )+OLDIEN
998 ZFROM = ISUPPZ( 2*WINDEX-1 )
999 ZTO = ISUPPZ( 2*WINDEX )
1000 ISUPMN = ISUPMN + OLDIEN
1001 ISUPMX = ISUPMX + OLDIEN
1003.LT.
IF(ISUPMNZFROM) THEN
1004 DO 122 II = ISUPMN,ZFROM-1
1005 Z( II, WINDEX ) = ZERO
1008.GT.
IF(ISUPMXZTO) THEN
1009 DO 123 II = ZTO+1,ISUPMX
1010 Z( II, WINDEX ) = ZERO
1013 CALL CSSCAL( ZTO-ZFROM+1, NRMINV,
1014 $ Z( ZFROM, WINDEX ), 1 )
1017 W( WINDEX ) = LAMBDA+SIGMA
1026 WGAP( WINDMN ) = MAX( WGAP(WINDMN),
1027 $ W(WINDEX)-WERR(WINDEX)
1028 $ - W(WINDMN)-WERR(WINDMN) )
1030.LT.
IF( WINDEXWEND ) THEN
1031 WGAP( WINDEX ) = MAX( SAVGAP,
1032 $ W( WINDPL )-WERR( WINDPL )
1033 $ - W( WINDEX )-WERR( WINDEX) )
subroutine slarrb(n, d, lld, ifirst, ilast, rtol1, rtol2, offset, w, wgap, werr, work, iwork, pivmin, spdiam, twist, info)
SLARRB provides limited bisection to locate eigenvalues for more accuracy.
subroutine slarrf(n, d, l, ld, clstrt, clend, w, wgap, werr, spdiam, clgapl, clgapr, pivmin, sigma, dplus, lplus, work, info)
SLARRF finds a new relatively robust representation such that at least one of the eigenvalues is rela...
subroutine clarrv(n, vl, vu, d, l, pivmin, isplit, m, dol, dou, minrgp, rtol1, rtol2, w, werr, wgap, iblock, indexw, gers, z, ldz, isuppz, work, iwork, info)
CLARRV computes the eigenvectors of the tridiagonal matrix T = L D LT given L, D and the eigenvalues ...
subroutine clar1v(n, b1, bn, lambda, d, l, ld, lld, pivmin, gaptol, z, wantnc, negcnt, ztz, mingma, r, isuppz, nrminv, resid, rqcorr, work)
CLAR1V computes the (scaled) r-th column of the inverse of the submatrix in rows b1 through bn of the...