275 SUBROUTINE dlaqr2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
276 $ IHIZ, Z, LDZ, NS, ND, SR, SI, V, LDV, NH, T,
277 $ LDT, NV, WV, LDWV, WORK, LWORK )
284 INTEGER IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
285 $ ldz, lwork, n, nd, nh, ns, nv, nw
289 DOUBLE PRECISION H( ldh, * ), SI( * ), SR( * ), T( ldt, * ),
290 $ v( ldv, * ), work( * ), wv( ldwv, * ),
296 DOUBLE PRECISION ZERO, ONE
297 parameter( zero = 0.0d0, one = 1.0d0 )
300 DOUBLE PRECISION AA, BB, BETA, CC, CS, DD, EVI, EVK, FOO, S,
301 $ safmax, safmin, smlnum, sn, tau, ulp
302 INTEGER I, IFST, ILST, INFO, INFQR, J, JW, K, KCOL,
303 $ kend, kln, krow, kwtop, ltop, lwk1, lwk2,
305 LOGICAL BULGE, SORTED
308 DOUBLE PRECISION DLAMCH
316 INTRINSIC abs, dble, int, max, min, sqrt
322 jw = min( nw, kbot-ktop+1 )
329 CALL dgehrd( jw, 1, jw-1, t, ldt, work, work, -1, info )
330 lwk1 = int( work( 1 ) )
334 CALL dormhr(
'R',
'N', jw, jw, 1, jw-1, t, ldt, work, v, ldv,
336 lwk2 = int( work( 1 ) )
340 lwkopt = jw + max( lwk1, lwk2 )
345 IF( lwork.EQ.-1 )
THEN 346 work( 1 ) = dble( lwkopt )
363 safmin = dlamch(
'SAFE MINIMUM' )
364 safmax = one / safmin
365 CALL dlabad( safmin, safmax )
366 ulp = dlamch(
'PRECISION' )
367 smlnum = safmin*( dble( n ) / ulp )
371 jw = min( nw, kbot-ktop+1 )
372 kwtop = kbot - jw + 1
373 IF( kwtop.EQ.ktop )
THEN 376 s = h( kwtop, kwtop-1 )
379 IF( kbot.EQ.kwtop )
THEN 383 sr( kwtop ) = h( kwtop, kwtop )
387 IF( abs( s ).LE.max( smlnum, ulp*abs( h( kwtop, kwtop ) ) ) )
392 $ h( kwtop, kwtop-1 ) = zero
404 CALL dlacpy(
'U', jw, jw, h( kwtop, kwtop ), ldh, t, ldt )
405 CALL dcopy( jw-1, h( kwtop+1, kwtop ), ldh+1, t( 2, 1 ), ldt+1 )
407 CALL dlaset(
'A', jw, jw, zero, one, v, ldv )
408 CALL dlahqr( .true., .true., jw, 1, jw, t, ldt, sr( kwtop ),
409 $ si( kwtop ), 1, jw, v, ldv, infqr )
418 $ t( jw, jw-2 ) = zero
425 IF( ilst.LE.ns )
THEN 429 bulge = t( ns, ns-1 ).NE.zero
434 IF( .NOT.bulge )
THEN 438 foo = abs( t( ns, ns ) )
441 IF( abs( s*v( 1, ns ) ).LE.max( smlnum, ulp*foo ) )
THEN 452 CALL dtrexc(
'V', jw, t, ldt, v, ldv, ifst, ilst, work,
460 foo = abs( t( ns, ns ) ) + sqrt( abs( t( ns, ns-1 ) ) )*
461 $ sqrt( abs( t( ns-1, ns ) ) )
464 IF( max( abs( s*v( 1, ns ) ), abs( s*v( 1, ns-1 ) ) ).LE.
465 $ max( smlnum, ulp*foo ) )
THEN 477 CALL dtrexc(
'V', jw, t, ldt, v, ldv, ifst, ilst, work,
510 ELSE IF( t( i+1, i ).EQ.zero )
THEN 518 evi = abs( t( i, i ) )
520 evi = abs( t( i, i ) ) + sqrt( abs( t( i+1, i ) ) )*
521 $ sqrt( abs( t( i, i+1 ) ) )
525 evk = abs( t( k, k ) )
526 ELSE IF( t( k+1, k ).EQ.zero )
THEN 527 evk = abs( t( k, k ) )
529 evk = abs( t( k, k ) ) + sqrt( abs( t( k+1, k ) ) )*
530 $ sqrt( abs( t( k, k+1 ) ) )
533 IF( evi.GE.evk )
THEN 539 CALL dtrexc(
'V', jw, t, ldt, v, ldv, ifst, ilst, work,
549 ELSE IF( t( i+1, i ).EQ.zero )
THEN 564 IF( i.GE.infqr+1 )
THEN 565 IF( i.EQ.infqr+1 )
THEN 566 sr( kwtop+i-1 ) = t( i, i )
567 si( kwtop+i-1 ) = zero
569 ELSE IF( t( i, i-1 ).EQ.zero )
THEN 570 sr( kwtop+i-1 ) = t( i, i )
571 si( kwtop+i-1 ) = zero
578 CALL dlanv2( aa, bb, cc, dd, sr( kwtop+i-2 ),
579 $ si( kwtop+i-2 ), sr( kwtop+i-1 ),
580 $ si( kwtop+i-1 ), cs, sn )
586 IF( ns.LT.jw .OR. s.EQ.zero )
THEN 587 IF( ns.GT.1 .AND. s.NE.zero )
THEN 591 CALL dcopy( ns, v, ldv, work, 1 )
593 CALL dlarfg( ns, beta, work( 2 ), 1, tau )
596 CALL dlaset(
'L', jw-2, jw-2, zero, zero, t( 3, 1 ), ldt )
598 CALL dlarf(
'L', ns, jw, work, 1, tau, t, ldt,
600 CALL dlarf(
'R', ns, ns, work, 1, tau, t, ldt,
602 CALL dlarf(
'R', jw, ns, work, 1, tau, v, ldv,
605 CALL dgehrd( jw, 1, ns, t, ldt, work, work( jw+1 ),
612 $ h( kwtop, kwtop-1 ) = s*v( 1, 1 )
613 CALL dlacpy(
'U', jw, jw, t, ldt, h( kwtop, kwtop ), ldh )
614 CALL dcopy( jw-1, t( 2, 1 ), ldt+1, h( kwtop+1, kwtop ),
620 IF( ns.GT.1 .AND. s.NE.zero )
621 $
CALL dormhr(
'R',
'N', jw, ns, 1, ns, t, ldt, work, v, ldv,
622 $ work( jw+1 ), lwork-jw, info )
631 DO 70 krow = ltop, kwtop - 1, nv
632 kln = min( nv, kwtop-krow )
633 CALL dgemm(
'N',
'N', kln, jw, jw, one, h( krow, kwtop ),
634 $ ldh, v, ldv, zero, wv, ldwv )
635 CALL dlacpy(
'A', kln, jw, wv, ldwv, h( krow, kwtop ), ldh )
641 DO 80 kcol = kbot + 1, n, nh
642 kln = min( nh, n-kcol+1 )
643 CALL dgemm(
'C',
'N', jw, kln, jw, one, v, ldv,
644 $ h( kwtop, kcol ), ldh, zero, t, ldt )
645 CALL dlacpy(
'A', jw, kln, t, ldt, h( kwtop, kcol ),
653 DO 90 krow = iloz, ihiz, nv
654 kln = min( nv, ihiz-krow+1 )
655 CALL dgemm(
'N',
'N', kln, jw, jw, one, z( krow, kwtop ),
656 $ ldz, v, ldv, zero, wv, ldwv )
657 CALL dlacpy(
'A', kln, jw, wv, ldwv, z( krow, kwtop ),
677 work( 1 ) = dble( lwkopt )
subroutine dlahqr(WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI, ILOZ, IHIZ, Z, LDZ, INFO)
DLAHQR computes the eigenvalues and Schur factorization of an upper Hessenberg matrix, using the double-shift/single-shift QR algorithm.
subroutine dlarfg(N, ALPHA, X, INCX, TAU)
DLARFG generates an elementary reflector (Householder matrix).
subroutine dlanv2(A, B, C, D, RT1R, RT1I, RT2R, RT2I, CS, SN)
DLANV2 computes the Schur factorization of a real 2-by-2 nonsymmetric matrix in standard form...
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
DGEMM
subroutine dormhr(SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMHR
subroutine dlarf(SIDE, M, N, V, INCV, TAU, C, LDC, WORK)
DLARF applies an elementary reflector to a general rectangular matrix.
subroutine dlaqr2(WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ, IHIZ, Z, LDZ, NS, ND, SR, SI, V, LDV, NH, T, LDT, NV, WV, LDWV, WORK, LWORK)
DLAQR2 performs the orthogonal similarity transformation of a Hessenberg matrix to detect and deflate...
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine dtrexc(COMPQ, N, T, LDT, Q, LDQ, IFST, ILST, WORK, INFO)
DTREXC
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dgehrd(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
DGEHRD