152 SUBROUTINE dlasd4( N, I, D, Z, DELTA, RHO, SIGMA, WORK, INFO )
160 DOUBLE PRECISION RHO, SIGMA
163 DOUBLE PRECISION D( * ), DELTA( * ), WORK( * ), Z( * )
170 parameter( maxit = 400 )
171 DOUBLE PRECISION ZERO, ONE, TWO, THREE, FOUR, EIGHT, TEN
172 PARAMETER ( zero = 0.0d+0, one = 1.0d+0, two = 2.0d+0,
173 $ three = 3.0d+0, four = 4.0d+0, eight = 8.0d+0,
177 LOGICAL ORGATI, , SWTCH3, GEOMAVG
178 INTEGER II, IIM1, IIP1, IP1, ITER, J, NITER
179 DOUBLE PRECISION A, B, C, , DELSQ2, SQ2, DPHI, DPSI, DTIIM,
180 $ DTIIP, DTIPSQ, DTISQ, DTNSQ, DTNSQ1, DW, EPS,
181 $ ERRETM, ETA, PHI, PREW, PSI, RHOINV, SGLB,
182 $ SGUB, TAU, TAU2, TEMP, TEMP1, TEMP2, W
185 DOUBLE PRECISION DD( 3 ), ZZ( 3 )
191 DOUBLE PRECISION DLAMCH
195 INTRINSIC abs,
max,
min, sqrt
209 sigma = sqrt( d( 1 )*d( 1 )+rho*z( 1 )*z( 1 ) )
215 CALL dlasd5( i, d, z, delta, rho, sigma, work )
221 eps = dlamch( 'epsilon
' )
241 TEMP1 = TEMP / ( D( N )+SQRT( D( N )*D( N )+TEMP ) )
243 WORK( J ) = D( J ) + D( N ) + TEMP1
244 DELTA( J ) = ( D( J )-D( N ) ) - TEMP1
249 PSI = PSI + Z( J )*Z( J ) / ( DELTA( J )*WORK( J ) )
253 W = C + Z( II )*Z( II ) / ( DELTA( II )*WORK( II ) ) +
254 $ Z( N )*Z( N ) / ( DELTA( N )*WORK( N ) )
257 TEMP1 = SQRT( D( N )*D( N )+RHO )
258 TEMP = Z( N-1 )*Z( N-1 ) / ( ( D( N-1 )+TEMP1 )*
259 $ ( D( N )-D( N-1 )+RHO / ( D( N )+TEMP1 ) ) ) +
260 $ Z( N )*Z( N ) / RHO
268 DELSQ = ( D( N )-D( N-1 ) )*( D( N )+D( N-1 ) )
269 A = -C*DELSQ + Z( N-1 )*Z( N-1 ) + Z( N )*Z( N )
270 B = Z( N )*Z( N )*DELSQ
272 TAU2 = TWO*B / ( SQRT( A*A+FOUR*B*C )-A )
274 TAU2 = ( A+SQRT( A*A+FOUR*B*C ) ) / ( TWO*C )
276 TAU = TAU2 / ( D( N )+SQRT( D( N )*D( N )+TAU2 ) )
283 DELSQ = ( D( N )-D( N-1 ) )*( D( N )+D( N-1 ) )
284 A = -C*DELSQ + Z( N-1 )*Z( N-1 ) + Z( N )*Z( N )
285 B = Z( N )*Z( N )*DELSQ
291 TAU2 = TWO*B / ( SQRT( A*A+FOUR*B*C )-A )
293 TAU2 = ( A+SQRT( A*A+FOUR*B*C ) ) / ( TWO*C )
295 TAU = TAU2 / ( D( N )+SQRT( D( N )*D( N )+TAU2 ) )
309 DELTA( J ) = ( D( J )-D( N ) ) - TAU
310 WORK( J ) = D( J ) + D( N ) + TAU
319 TEMP = Z( J ) / ( DELTA( J )*WORK( J ) )
320 PSI = PSI + Z( J )*TEMP
321 DPSI = DPSI + TEMP*TEMP
322 ERRETM = ERRETM + PSI
324 ERRETM = ABS( ERRETM )
328 TEMP = Z( N ) / ( DELTA( N )*WORK( N ) )
331 ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV
334 W = RHOINV + PHI + PSI
338.LE.
IF( ABS( W )EPS*ERRETM ) THEN
345 DTNSQ1 = WORK( N-1 )*DELTA( N-1 )
346 DTNSQ = WORK( N )*DELTA( N )
347 C = W - DTNSQ1*DPSI - DTNSQ*DPHI
348 A = ( DTNSQ+DTNSQ1 )*W - DTNSQ*DTNSQ1*( DPSI+DPHI )
353 ETA = RHO - SIGMA*SIGMA
354.GE.
ELSE IF( AZERO ) THEN
355 ETA = ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
357 ETA = TWO*B / ( A-SQRT( ABS( A*A-FOUR*B*C ) ) )
367 $ ETA = -W / ( DPSI+DPHI )
372 ETA = ETA / ( SIGMA+SQRT( ETA+SIGMA*SIGMA ) )
377 DELTA( J ) = DELTA( J ) - ETA
378 WORK( J ) = WORK( J ) + ETA
387 TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
388 PSI = PSI + Z( J )*TEMP
389 DPSI = DPSI + TEMP*TEMP
390 ERRETM = ERRETM + PSI
392 ERRETM = ABS( ERRETM )
396 TAU2 = WORK( N )*DELTA( N )
400 ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV
403 W = RHOINV + PHI + PSI
409 DO 90 NITER = ITER, MAXIT
413.LE.
IF( ABS( W )EPS*ERRETM ) THEN
419 DTNSQ1 = WORK( N-1 )*DELTA( N-1 )
420 DTNSQ = WORK( N )*DELTA( N )
421 C = W - DTNSQ1*DPSI - DTNSQ*DPHI
422 A = ( DTNSQ+DTNSQ1 )*W - DTNSQ1*DTNSQ*( DPSI+DPHI )
425 ETA = ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
427 ETA = TWO*B / ( A-SQRT( ABS( A*A-FOUR*B*C ) ) )
437 $ ETA = -W / ( DPSI+DPHI )
442 ETA = ETA / ( SIGMA+SQRT( ETA+SIGMA*SIGMA ) )
447 DELTA( J ) = DELTA( J ) - ETA
448 WORK( J ) = WORK( J ) + ETA
457 TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
458 PSI = PSI + Z( J )*TEMP
459 DPSI = DPSI + TEMP*TEMP
460 ERRETM = ERRETM + PSI
462 ERRETM = ABS( ERRETM )
466 TAU2 = WORK( N )*DELTA( N )
470 ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV
473 W = RHOINV + PHI + PSI
492 DELSQ = ( D( IP1 )-D( I ) )*( D( IP1 )+D( I ) )
494 SQ2=SQRT( ( D( I )*D( I )+D( IP1 )*D( IP1 ) ) / TWO )
495 TEMP = DELSQ2 / ( D( I )+SQ2 )
497 WORK( J ) = D( J ) + D( I ) + TEMP
498 DELTA( J ) = ( D( J )-D( I ) ) - TEMP
503 PSI = PSI + Z( J )*Z( J ) / ( WORK( J )*DELTA( J ) )
507 DO 120 J = N, I + 2, -1
508 PHI = PHI + Z( J )*Z( J ) / ( WORK( J )*DELTA( J ) )
510 C = RHOINV + PSI + PHI
511 W = C + Z( I )*Z( I ) / ( WORK( I )*DELTA( I ) ) +
512 $ Z( IP1 )*Z( IP1 ) / ( WORK( IP1 )*DELTA( IP1 ) )
524 SGUB = DELSQ2 / ( D( I )+SQ2 )
525 A = C*DELSQ + Z( I )*Z( I ) + Z( IP1 )*Z( IP1 )
526 B = Z( I )*Z( I )*DELSQ
528 TAU2 = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
530 TAU2 = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
537 TAU = TAU2 / ( D( I )+SQRT( D( I )*D( I )+TAU2 ) )
539.LE..AND..LE.
IF( (D(I)TEMP*D(IP1))(ABS(Z(I))TEMP)
540.AND..GT.
$ (D(I)ZERO) ) THEN
541 TAU = MIN( TEN*D(I), SGUB )
552 SGLB = -DELSQ2 / ( D( II )+SQ2 )
554 A = C*DELSQ - Z( I )*Z( I ) - Z( IP1 )*Z( IP1 )
555 B = Z( IP1 )*Z( IP1 )*DELSQ
557 TAU2 = TWO*B / ( A-SQRT( ABS( A*A+FOUR*B*C ) ) )
559 TAU2 = -( A+SQRT( ABS( A*A+FOUR*B*C ) ) ) / ( TWO*C )
566 TAU = TAU2 / ( D( IP1 )+SQRT( ABS( D( IP1 )*D( IP1 )+
570 SIGMA = D( II ) + TAU
572 WORK( J ) = D( J ) + D( II ) + TAU
573 DELTA( J ) = ( D( J )-D( II ) ) - TAU
584 TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
585 PSI = PSI + Z( J )*TEMP
586 DPSI = DPSI + TEMP*TEMP
587 ERRETM = ERRETM + PSI
589 ERRETM = ABS( ERRETM )
595 DO 160 J = N, IIP1, -1
596 TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
597 PHI = PHI + Z( J )*TEMP
598 DPHI = DPHI + TEMP*TEMP
599 ERRETM = ERRETM + PHI
602 W = RHOINV + PHI + PSI
615.EQ..OR..EQ.
IF( II1 IIN )
618 TEMP = Z( II ) / ( WORK( II )*DELTA( II ) )
619 DW = DPSI + DPHI + TEMP*TEMP
622 ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV
623 $ + THREE*ABS( TEMP )
628.LE.
IF( ABS( W )EPS*ERRETM ) THEN
633 SGLB = MAX( SGLB, TAU )
635 SGUB = MIN( SGUB, TAU )
641.NOT.
IF( SWTCH3 ) THEN
642 DTIPSQ = WORK( IP1 )*DELTA( IP1 )
643 DTISQ = WORK( I )*DELTA( I )
645 C = W - DTIPSQ*DW + DELSQ*( Z( I ) / DTISQ )**2
647 C = W - DTISQ*DW - DELSQ*( Z( IP1 ) / DTIPSQ )**2
649 A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW
654 A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ*( DPSI+DPHI )
656 A = Z( IP1 )*Z( IP1 ) + DTISQ*DTISQ*( DPSI+DPHI )
660.LE.
ELSE IF( AZERO ) THEN
661 ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
663 ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
669 DTIIM = WORK( IIM1 )*DELTA( IIM1 )
670 DTIIP = WORK( IIP1 )*DELTA( IIP1 )
671 TEMP = RHOINV + PSI + PHI
673 TEMP1 = Z( IIM1 ) / DTIIM
675 C = ( TEMP - DTIIP*( DPSI+DPHI ) ) -
676 $ ( D( IIM1 )-D( IIP1 ) )*( D( IIM1 )+D( IIP1 ) )*TEMP1
677 ZZ( 1 ) = Z( IIM1 )*Z( IIM1 )
678.LT.
IF( DPSITEMP1 ) THEN
679 ZZ( 3 ) = DTIIP*DTIIP*DPHI
681 ZZ( 3 ) = DTIIP*DTIIP*( ( DPSI-TEMP1 )+DPHI )
684 TEMP1 = Z( IIP1 ) / DTIIP
686 C = ( TEMP - DTIIM*( DPSI+DPHI ) ) -
687 $ ( D( IIP1 )-D( IIM1 ) )*( D( IIM1 )+D( IIP1 ) )*TEMP1
688.LT.
IF( DPHITEMP1 ) THEN
689 ZZ( 1 ) = DTIIM*DTIIM*DPSI
691 ZZ( 1 ) = DTIIM*DTIIM*( DPSI+( DPHI-TEMP1 ) )
693 ZZ( 3 ) = Z( IIP1 )*Z( IIP1 )
695 ZZ( 2 ) = Z( II )*Z( II )
697 DD( 2 ) = DELTA( II )*WORK( II )
699 CALL DLAED6( NITER, ORGATI, C, DD, ZZ, W, ETA, INFO )
708 DTIPSQ = WORK( IP1 )*DELTA( IP1 )
709 DTISQ = WORK( I )*DELTA( I )
711 C = W - DTIPSQ*DW + DELSQ*( Z( I ) / DTISQ )**2
713 C = W - DTISQ*DW - DELSQ*( Z( IP1 ) / DTIPSQ )**2
715 A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW
720 A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ*( DPSI+DPHI )
722 A = Z( IP1 )*Z( IP1 ) + DTISQ*DTISQ*( DPSI+DPHI)
726.LE.
ELSE IF( AZERO ) THEN
727 ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
729 ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
743 ETA = ETA / ( SIGMA+SQRT( SIGMA*SIGMA+ETA ) )
745.GT..OR..LT.
IF( TEMPSGUB TEMPSGLB ) THEN
747 ETA = ( SGUB-TAU ) / TWO
749 ETA = ( SGLB-TAU ) / TWO
752.LT.
IF( W ZERO ) THEN
753.GT.
IF( TAU ZERO ) THEN
754 ETA = SQRT(SGUB*TAU)-TAU
757.GT.
IF( SGLB ZERO ) THEN
758 ETA = SQRT(SGLB*TAU)-TAU
770 WORK( J ) = WORK( J ) + ETA
771 DELTA( J ) = DELTA( J ) - ETA
780 TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
781 PSI = PSI + Z( J )*TEMP
782 DPSI = DPSI + TEMP*TEMP
783 ERRETM = ERRETM + PSI
785 ERRETM = ABS( ERRETM )
791 DO 190 J = N, IIP1, -1
792 TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
793 PHI = PHI + Z( J )*TEMP
794 DPHI = DPHI + TEMP*TEMP
795 ERRETM = ERRETM + PHI
798 TAU2 = WORK( II )*DELTA( II )
799 TEMP = Z( II ) / TAU2
800 DW = DPSI + DPHI + TEMP*TEMP
802 W = RHOINV + PHI + PSI + TEMP
803 ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV
804 $ + THREE*ABS( TEMP )
809.GT.
IF( -WABS( PREW ) / TEN )
812.GT.
IF( WABS( PREW ) / TEN )
820 DO 230 NITER = ITER, MAXIT
824.LE.
IF( ABS( W )EPS*ERRETM ) THEN
830 SGLB = MAX( SGLB, TAU )
832 SGUB = MIN( SGUB, TAU )
837.NOT.
IF( SWTCH3 ) THEN
838 DTIPSQ = WORK( IP1 )*DELTA( IP1 )
839 DTISQ = WORK( I )*DELTA( I )
840.NOT.
IF( SWTCH ) THEN
842 C = W - DTIPSQ*DW + DELSQ*( Z( I ) / DTISQ )**2
844 C = W - DTISQ*DW - DELSQ*( Z( IP1 ) / DTIPSQ )**2
847 TEMP = Z( II ) / ( WORK( II )*DELTA( II ) )
849 DPSI = DPSI + TEMP*TEMP
851 DPHI = DPHI + TEMP*TEMP
853 C = W - DTISQ*DPSI - DTIPSQ*DPHI
855 A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW
859.NOT.
IF( SWTCH ) THEN
861 A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ*
864 A = Z( IP1 )*Z( IP1 ) +
865 $ DTISQ*DTISQ*( DPSI+DPHI )
868 A = DTISQ*DTISQ*DPSI + DTIPSQ*DTIPSQ*DPHI
872.LE.
ELSE IF( AZERO ) THEN
873 ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
875 ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
881 DTIIM = WORK( IIM1 )*DELTA( IIM1 )
882 DTIIP = WORK( IIP1 )*DELTA( IIP1 )
883 TEMP = RHOINV + PSI + PHI
885 C = TEMP - DTIIM*DPSI - DTIIP*DPHI
886 ZZ( 1 ) = DTIIM*DTIIM*DPSI
887 ZZ( 3 ) = DTIIP*DTIIP*DPHI
890 TEMP1 = Z( IIM1 ) / DTIIM
892 TEMP2 = ( D( IIM1 )-D( IIP1 ) )*
893 $ ( D( IIM1 )+D( IIP1 ) )*TEMP1
894 C = TEMP - DTIIP*( DPSI+DPHI ) - TEMP2
895 ZZ( 1 ) = Z( IIM1 )*Z( IIM1 )
896.LT.
IF( DPSITEMP1 ) THEN
897 ZZ( 3 ) = DTIIP*DTIIP*DPHI
899 ZZ( 3 ) = DTIIP*DTIIP*( ( DPSI-TEMP1 )+DPHI )
902 TEMP1 = Z( IIP1 ) / DTIIP
904 TEMP2 = ( D( IIP1 )-D( IIM1 ) )*
905 $ ( D( IIM1 )+D( IIP1 ) )*TEMP1
906 C = TEMP - DTIIM*( DPSI+DPHI ) - TEMP2
907.LT.
IF( DPHITEMP1 ) THEN
908 ZZ( 1 ) = DTIIM*DTIIM*DPSI
910 ZZ( 1 ) = DTIIM*DTIIM*( DPSI+( DPHI-TEMP1 ) )
912 ZZ( 3 ) = Z( IIP1 )*Z( IIP1 )
916 DD( 2 ) = DELTA( II )*WORK( II )
918 CALL DLAED6( NITER, ORGATI, C, DD, ZZ, W, ETA, INFO )
927 DTIPSQ = WORK( IP1 )*DELTA( IP1 )
928 DTISQ = WORK( I )*DELTA( I )
929.NOT.
IF( SWTCH ) THEN
931 C = W - DTIPSQ*DW + DELSQ*( Z( I )/DTISQ )**2
933 C = W - DTISQ*DW - DELSQ*( Z( IP1 )/DTIPSQ )**2
936 TEMP = Z( II ) / ( WORK( II )*DELTA( II ) )
938 DPSI = DPSI + TEMP*TEMP
940 DPHI = DPHI + TEMP*TEMP
942 C = W - DTISQ*DPSI - DTIPSQ*DPHI
944 A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW
948.NOT.
IF( SWTCH ) THEN
950 A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ*
953 A = Z( IP1 )*Z( IP1 ) +
954 $ DTISQ*DTISQ*( DPSI+DPHI )
957 A = DTISQ*DTISQ*DPSI + DTIPSQ*DTIPSQ*DPHI
961.LE.
ELSE IF( AZERO ) THEN
962 ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
964 ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
978 ETA = ETA / ( SIGMA+SQRT( SIGMA*SIGMA+ETA ) )
980.GT..OR..LT.
IF( TEMPSGUB TEMPSGLB ) THEN
982 ETA = ( SGUB-TAU ) / TWO
984 ETA = ( SGLB-TAU ) / TWO
987.LT.
IF( W ZERO ) THEN
988.GT.
IF( TAU ZERO ) THEN
989 ETA = SQRT(SGUB*TAU)-TAU
992.GT.
IF( SGLB ZERO ) THEN
993 ETA = SQRT(SGLB*TAU)-TAU
1005 WORK( J ) = WORK( J ) + ETA
1006 DELTA( J ) = DELTA( J ) - ETA
1015 TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
1016 PSI = PSI + Z( J )*TEMP
1017 DPSI = DPSI + TEMP*TEMP
1018 ERRETM = ERRETM + PSI
1020 ERRETM = ABS( ERRETM )
1026 DO 220 J = N, IIP1, -1
1027 TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
1028 PHI = PHI + Z( J )*TEMP
1029 DPHI = DPHI + TEMP*TEMP
1030 ERRETM = ERRETM + PHI
1033 TAU2 = WORK( II )*DELTA( II )
1034 TEMP = Z( II ) / TAU2
1035 DW = DPSI + DPHI + TEMP*TEMP
1037 W = RHOINV + PHI + PSI + TEMP
1038 ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV
1039 $ + THREE*ABS( TEMP )
1042.GT..AND..GT.
IF( W*PREWZERO ABS( W )ABS( PREW ) / TEN )
1043.NOT.
$ SWTCH = SWTCH
subroutine dlasd5(i, d, z, delta, rho, dsigma, work)
DLASD5 computes the square root of the i-th eigenvalue of a positive symmetric rank-one modification ...
subroutine dlasd4(n, i, d, z, delta, rho, sigma, work, info)
DLASD4 computes the square root of the i-th updated eigenvalue of a positive symmetric rank-one modif...
subroutine dlaed6(kniter, orgati, rho, d, z, finit, tau, info)
DLAED6 used by DSTEDC. Computes one Newton step in solution of the secular equation.