275 SUBROUTINE slaqr2( 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 REAL H( LDH, * ), SI( * ), SR( * ), T( LDT, * ),
290 $ V( LDV, * ), WORK( * ), WV( LDWV, * ),
297 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
300 REAL 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
316 INTRINSIC abs, int, max, min, real, sqrt
322 jw = min( nw, kbot-ktop+1 )
329 CALL sgehrd( jw, 1, jw-1, t, ldt, work, work, -1, info )
330 lwk1 = int( work( 1 ) )
334 CALL sormhr(
'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 ) = real( lwkopt )
363 safmin = slamch(
'SAFE MINIMUM' )
364 safmax = one / safmin
365 CALL slabad( safmin, safmax )
366 ulp = slamch(
'PRECISION' )
367 smlnum = safmin*( real( 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 slacpy(
'U', jw, jw, h( kwtop, kwtop ), ldh, t, ldt )
405 CALL scopy( jw-1, h( kwtop+1, kwtop ), ldh+1, t( 2, 1 ), ldt+1 )
407 CALL slaset(
'A', jw, jw, zero, one, v, ldv )
408 CALL slahqr( .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 strexc(
'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 strexc(
'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 strexc(
'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 slanv2( 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 scopy( ns, v, ldv, work, 1 )
593 CALL slarfg( ns, beta, work( 2 ), 1, tau )
596 CALL slaset(
'L', jw-2, jw-2, zero, zero, t( 3, 1 ), ldt )
598 CALL slarf(
'L', ns, jw, work, 1, tau, t, ldt,
600 CALL slarf(
'R', ns, ns, work, 1, tau, t, ldt,
602 CALL slarf(
'R', jw, ns, work, 1, tau, v, ldv,
605 CALL sgehrd( jw, 1, ns, t, ldt, work, work( jw+1 ),
612 $ h( kwtop, kwtop-1 ) = s*v( 1, 1 )
613 CALL slacpy(
'U', jw, jw, t, ldt, h( kwtop, kwtop ), ldh )
614 CALL scopy( jw-1, t( 2, 1 ), ldt+1, h( kwtop+1, kwtop ),
620 IF( ns.GT.1 .AND. s.NE.zero )
621 $
CALL sormhr(
'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 sgemm(
'N',
'N', kln, jw, jw, one, h( krow, kwtop ),
634 $ ldh, v, ldv, zero, wv, ldwv )
635 CALL slacpy(
'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 sgemm(
'C',
'N', jw, kln, jw, one, v, ldv,
644 $ h( kwtop, kcol ), ldh, zero, t, ldt )
645 CALL slacpy(
'A', jw, kln, t, ldt, h( kwtop, kcol ),
653 DO 90 krow = iloz, ihiz, nv
654 kln = min( nv, ihiz-krow+1 )
655 CALL sgemm(
'N',
'N', kln, jw, jw, one, z( krow, kwtop ),
656 $ ldz, v, ldv, zero, wv, ldwv )
657 CALL slacpy(
'A', kln, jw, wv, ldwv, z( krow, kwtop ),
677 work( 1 ) = real( lwkopt )
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine sgehrd(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
SGEHRD
subroutine slarfg(N, ALPHA, X, INCX, TAU)
SLARFG generates an elementary reflector (Householder matrix).
subroutine slanv2(A, B, C, D, RT1R, RT1I, RT2R, RT2I, CS, SN)
SLANV2 computes the Schur factorization of a real 2-by-2 nonsymmetric matrix in standard form.
subroutine slarf(SIDE, M, N, V, INCV, TAU, C, LDC, WORK)
SLARF applies an elementary reflector to a general rectangular matrix.
subroutine slaqr2(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)
SLAQR2 performs the orthogonal similarity transformation of a Hessenberg matrix to detect and deflate...
subroutine slahqr(WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI, ILOZ, IHIZ, Z, LDZ, INFO)
SLAHQR computes the eigenvalues and Schur factorization of an upper Hessenberg matrix,...
subroutine sormhr(SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMHR
subroutine strexc(COMPQ, N, T, LDT, Q, LDQ, IFST, ILST, WORK, INFO)
STREXC
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine sgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
SGEMM