270 SUBROUTINE dlaqr3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH,
272 $ IHIZ, Z, LDZ, NS, ND, SR, SI, V, LDV, NH, T,
273 $ LDT, NV, WV, LDWV, WORK, LWORK )
280 INTEGER IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
281 $ LDZ, LWORK, N, ND, NH, NS, NV, NW
285 DOUBLE PRECISION H( LDH, * ), SI( * ), SR( * ), T( LDT, * ),
286 $ V( LDV, * ), WORK( * ), WV( LDWV, * ),
292 DOUBLE PRECISION ZERO, ONE
293 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
296 DOUBLE PRECISION AA, BB, BETA, CC, CS, DD, EVI, EVK, FOO, S,
297 $ SAFMAX, SAFMIN, SMLNUM, SN, TAU, ULP
298 INTEGER I, IFST, ILST, INFO, INFQR, J, JW, K, KCOL,
299 $ kend, kln, krow, kwtop, ltop, lwk1, lwk2, lwk3,
301 LOGICAL BULGE, SORTED
304 DOUBLE PRECISION DLAMCH
306 EXTERNAL DLAMCH, ILAENV
314 INTRINSIC abs, dble, int, max, min, sqrt
320 jw = min( nw, kbot-ktop+1 )
327 CALL dgehrd( jw, 1, jw-1, t, ldt, work, work, -1, info )
328 lwk1 = int( work( 1 ) )
332 CALL dormhr(
'R',
'N', jw, jw, 1, jw-1, t, ldt, work, v,
335 lwk2 = int( work( 1 ) )
339 CALL dlaqr4( .true., .true., jw, 1, jw, t, ldt, sr, si, 1,
341 $ v, ldv, work, -1, infqr )
342 lwk3 = int( work( 1 ) )
346 lwkopt = max( jw+max( lwk1, lwk2 ), lwk3 )
351 IF( lwork.EQ.-1 )
THEN
352 work( 1 ) = dble( lwkopt )
369 safmin = dlamch(
'SAFE MINIMUM' )
370 safmax = one / safmin
371 ulp = dlamch(
'PRECISION' )
372 smlnum = safmin*( dble( n ) / ulp )
376 jw = min( nw, kbot-ktop+1 )
377 kwtop = kbot - jw + 1
378 IF( kwtop.EQ.ktop )
THEN
381 s = h( kwtop, kwtop-1 )
384 IF( kbot.EQ.kwtop )
THEN
388 sr( kwtop ) = h( kwtop, kwtop )
392 IF( abs( s ).LE.max( smlnum, ulp*abs( h( kwtop, kwtop ) ) ) )
397 $ h( kwtop, kwtop-1 ) = zero
409 CALL dlacpy(
'U', jw, jw, h( kwtop, kwtop ), ldh, t, ldt )
410 CALL dcopy( jw-1, h( kwtop+1, kwtop ), ldh+1, t( 2, 1 ),
413 CALL dlaset(
'A', jw, jw, zero, one, v, ldv )
414 nmin = ilaenv( 12,
'DLAQR3',
'SV', jw, 1, jw, lwork )
415 IF( jw.GT.nmin )
THEN
416 CALL dlaqr4( .true., .true., jw, 1, jw, t, ldt, sr( kwtop ),
417 $ si( kwtop ), 1, jw, v, ldv, work, lwork, infqr )
419 CALL dlahqr( .true., .true., jw, 1, jw, t, ldt, sr( kwtop ),
420 $ si( kwtop ), 1, jw, v, ldv, infqr )
430 $ t( jw, jw-2 ) = zero
437 IF( ilst.LE.ns )
THEN
441 bulge = t( ns, ns-1 ).NE.zero
446 IF( .NOT. bulge )
THEN
450 foo = abs( t( ns, ns ) )
453 IF( abs( s*v( 1, ns ) ).LE.max( smlnum, ulp*foo ) )
THEN
464 CALL dtrexc(
'V', jw, t, ldt, v, ldv, ifst, ilst,
473 foo = abs( t( ns, ns ) ) + sqrt( abs( t( ns, ns-1 ) ) )*
474 $ sqrt( abs( t( ns-1, ns ) ) )
477 IF( max( abs( s*v( 1, ns ) ), abs( s*v( 1, ns-1 ) ) ).LE.
478 $ max( smlnum, ulp*foo ) )
THEN
490 CALL dtrexc(
'V', jw, t, ldt, v, ldv, ifst, ilst,
524 ELSE IF( t( i+1, i ).EQ.zero )
THEN
532 evi = abs( t( i, i ) )
534 evi = abs( t( i, i ) ) + sqrt( abs( t( i+1, i ) ) )*
535 $ sqrt( abs( t( i, i+1 ) ) )
539 evk = abs( t( k, k ) )
540 ELSE IF( t( k+1, k ).EQ.zero )
THEN
541 evk = abs( t( k, k ) )
543 evk = abs( t( k, k ) ) + sqrt( abs( t( k+1, k ) ) )*
544 $ sqrt( abs( t( k, k+1 ) ) )
547 IF( evi.GE.evk )
THEN
553 CALL dtrexc(
'V', jw, t, ldt, v, ldv, ifst, ilst,
564 ELSE IF( t( i+1, i ).EQ.zero )
THEN
579 IF( i.GE.infqr+1 )
THEN
580 IF( i.EQ.infqr+1 )
THEN
581 sr( kwtop+i-1 ) = t( i, i )
582 si( kwtop+i-1 ) = zero
584 ELSE IF( t( i, i-1 ).EQ.zero )
THEN
585 sr( kwtop+i-1 ) = t( i, i )
586 si( kwtop+i-1 ) = zero
593 CALL dlanv2( aa, bb, cc, dd, sr( kwtop+i-2 ),
594 $ si( kwtop+i-2 ), sr( kwtop+i-1 ),
595 $ si( kwtop+i-1 ), cs, sn )
601 IF( ns.LT.jw .OR. s.EQ.zero )
THEN
602 IF( ns.GT.1 .AND. s.NE.zero )
THEN
606 CALL dcopy( ns, v, ldv, work, 1 )
608 CALL dlarfg( ns, beta, work( 2 ), 1, tau )
610 CALL dlaset(
'L', jw-2, jw-2, zero, zero, t( 3, 1 ),
613 CALL dlarf1f(
'L', ns, jw, work, 1, tau, t, ldt,
615 CALL dlarf1f(
'R', ns, ns, work, 1, tau, t, ldt,
617 CALL dlarf1f(
'R', jw, ns, work, 1, tau, v, ldv,
620 CALL dgehrd( jw, 1, ns, t, ldt, work, work( jw+1 ),
627 $ h( kwtop, kwtop-1 ) = s*v( 1, 1 )
628 CALL dlacpy(
'U', jw, jw, t, ldt, h( kwtop, kwtop ), ldh )
629 CALL dcopy( jw-1, t( 2, 1 ), ldt+1, h( kwtop+1, kwtop ),
635 IF( ns.GT.1 .AND. s.NE.zero )
636 $
CALL dormhr(
'R',
'N', jw, ns, 1, ns, t, ldt, work, v,
638 $ work( jw+1 ), lwork-jw, info )
647 DO 70 krow = ltop, kwtop - 1, nv
648 kln = min( nv, kwtop-krow )
649 CALL dgemm(
'N',
'N', kln, jw, jw, one, h( krow, kwtop ),
650 $ ldh, v, ldv, zero, wv, ldwv )
651 CALL dlacpy(
'A', kln, jw, wv, ldwv, h( krow, kwtop ),
658 DO 80 kcol = kbot + 1, n, nh
659 kln = min( nh, n-kcol+1 )
660 CALL dgemm(
'C',
'N', jw, kln, jw, one, v, ldv,
661 $ h( kwtop, kcol ), ldh, zero, t, ldt )
662 CALL dlacpy(
'A', jw, kln, t, ldt, h( kwtop, kcol ),
670 DO 90 krow = iloz, ihiz, nv
671 kln = min( nv, ihiz-krow+1 )
672 CALL dgemm(
'N',
'N', kln, jw, jw, one, z( krow,
674 $ ldz, v, ldv, zero, wv, ldwv )
675 CALL dlacpy(
'A', kln, jw, wv, ldwv, z( krow, kwtop ),
695 work( 1 ) = dble( lwkopt )