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,
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,
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.GT..AND..NE.
IF( NS1 SZERO )
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 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...