242 SUBROUTINE ztrevc3( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
243 $ LDVR, MM, M, WORK, LWORK, RWORK, LRWORK, INFO)
251 CHARACTER HOWMNY, SIDE
252 INTEGER INFO, LDT, LDVL, LDVR, LWORK, LRWORK, M, MM, N
256 DOUBLE PRECISION RWORK( * )
257 COMPLEX*16 T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
264 DOUBLE PRECISION ZERO, ONE
265 parameter( zero = 0.0d+0, one = 1.0d+0 )
266 COMPLEX*16 CZERO, CONE
267 parameter( czero = ( 0.0d+0, 0.0d+0 ),
268 $ cone = ( 1.0d+0, 0.0d+0 ) )
270 parameter( nbmin = 8, nbmax = 128 )
273 LOGICAL ALLV, BOTHV, LEFTV, LQUERY, OVER, RIGHTV, SOMEV
274 INTEGER I, II, IS, J, K, KI, IV, MAXWRK, NB
275 DOUBLE PRECISION OVFL, REMAX, SCALE, SMIN, SMLNUM, ULP, UNFL
280 INTEGER ILAENV, IZAMAX
281 DOUBLE PRECISION DLAMCH, DZASUM
282 EXTERNAL lsame, ilaenv, izamax, dlamch, dzasum
289 INTRINSIC abs, dble, dcmplx, conjg, dimag,
max
292 DOUBLE PRECISION CABS1
295 cabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) )
301 bothv = lsame( side,
'B' )
302 rightv = lsame( side,
'R' ) .OR. bothv
303 leftv = lsame( side,
'L' ) .OR. bothv
305 allv = lsame( howmny,
'A' )
306 over = lsame( howmny,
'B' )
307 somev = lsame( howmny,
'S' )
323 nb = ilaenv( 1,
'ZTREVC', side // howmny, n, -1, -1, -1 )
327 lquery = ( lwork.EQ.-1 .OR. lrwork.EQ.-1 )
328 IF( .NOT.rightv .AND. .NOT.leftv )
THEN
330 ELSE IF( .NOT.allv .AND. .NOT.over .AND. .NOT.somev )
THEN
332 ELSE IF( n.LT.0 )
THEN
334 ELSE IF( ldt.LT.
max( 1, n ) )
THEN
336 ELSE IF( ldvl.LT.1 .OR. ( leftv .AND. ldvl.LT.n ) )
THEN
338 ELSE IF( ldvr.LT.1 .OR. ( rightv .AND. ldvr.LT.n ) )
THEN
340 ELSE IF( mm.LT.m )
THEN
342 ELSE IF( lwork.LT.
max( 1, 2*n ) .AND. .NOT.lquery )
THEN
344 ELSE IF ( lrwork.LT.
max( 1, n ) .AND. .NOT.lquery )
THEN
348 CALL xerbla(
'ZTREVC3', -info )
350 ELSE IF( lquery )
THEN
362 IF( over .AND. lwork .GE. n + 2*n*nbmin )
THEN
363 nb = (lwork - n) / (2*n)
364 nb =
min( nb, nbmax )
365 CALL zlaset(
'F', n, 1+2*nb, czero, czero, work, n )
372 unfl = dlamch(
'Safe minimum' )
375 ulp = dlamch(
'Precision' )
376 smlnum = unfl*( n / ulp )
381 work( i ) = t( i, i )
389 rwork( j ) = dzasum( j-1, t( 1, j ), 1 )
405 IF( .NOT.
SELECT( ki ) )
408 smin =
max( ulp*( cabs1( t( ki, ki ) ) ), smlnum )
413 work( ki + iv*n ) = cone
418 work( k + iv*n ) = -t( k, ki )
426 IF( cabs1( t( k, k ) ).LT.smin )
431 CALL zlatrs(
'Upper',
'No transpose',
'Non-unit',
'Y',
432 $ ki-1, t, ldt, work( 1 + iv*n ), scale,
434 work( ki + iv*n ) = scale
442 CALL zcopy( ki, work( 1 + iv*n ), 1, vr( 1, is ), 1 )
444 ii = izamax( ki, vr( 1, is ), 1 )
445 remax = one / cabs1( vr( ii, is ) )
446 CALL zdscal( ki, remax, vr( 1, is ), 1 )
452 ELSE IF( nb.EQ.1 )
THEN
456 $
CALL zgemv(
'N', n, ki-1, cone, vr, ldvr,
457 $ work( 1 + iv*n ), 1, dcmplx( scale ),
460 ii = izamax( n, vr( 1, ki
461 remax = one / cabs1( vr( ii, ki ) )
462 CALL zdscal( n, remax, vr( 1, ki ), 1 )
469 work( k + iv*n ) = czero
475 IF( (iv.EQ.1) .OR. (ki.EQ.1) )
THEN
476 CALL zgemm(
'N',
'N', n, nb-iv+1, ki+nb-iv, cone,
478 $ work( 1 + (iv)*n ), n,
483 ii = izamax( n, work( 1 + (nb+k)*n ), 1 )
484 remax = one / cabs1( work( ii + (nb+k)*n ) )
485 CALL zdscal( n, remax, work( 1 + (nb+k)*n ), 1 )
487 CALL zlacpy(
'F', n, nb-iv+1,
488 $ work( 1 + (nb+iv)*n ), n,
489 $ vr( 1, ki ), ldvr )
499 t( k, k ) = work( k )
520 IF( .NOT.
SELECT( ki ) )
523 smin =
max( ulp*( cabs1( t( ki, ki ) ) ), smlnum )
528 work( ki + iv*n ) = cone
533 work( k + iv*n ) = -conjg( t( ki, k ) )
540 t( k, k ) = t( k, k ) - t( ki, ki )
541 IF( cabs1( t( k, k ) ).LT.smin )
546 CALL zlatrs(
'Upper',
'Conjugate transpose''Non-unit',
547 $
'Y', n-ki, t( ki+1, ki+1 ), ldt,
548 $ work( ki+1 + iv*n ), scale, rwork, info )
549 work( ki + iv*n ) = scale
557 CALL zcopy( n-ki+1, work( ki + iv*n
559 ii = izamax( n-ki+1, vl( ki, is ), 1 ) + ki - 1
560 remax = one / cabs1( vl( ii, is ) )
561 CALL zdscal( n-ki+1, remax, vl( ki, is ), 1 )
567 ELSE IF( nb.EQ.1 )
THEN
571 $
CALL zgemv(
'N', n, n-ki, cone, vl( 1, ki+1 ), ldvl,
572 $ work( ki+1 + iv*n ), 1, dcmplx( scale ),
575 ii = izamax( n, vl( 1, ki ), 1 )
576 remax = one / cabs1( vl( ii, ki ) )
577 CALL zdscal( n, remax, vl( 1, ki ), 1 )
585 work( k + iv*n ) = czero
591 IF( (iv.EQ.nb) .OR. (ki.EQ.n) )
THEN
592 CALL zgemm(
'N',
'N', n, iv, n-ki+iv, cone,
593 $ vl( 1, ki-iv+1 ), ldvl,
594 $ work( ki-iv+1 + (1)*n ), n,
596 $ work( 1 + (nb+1)*n ), n )
599 ii = izamax( n, work( 1 + (nb+k)*n ), 1 )
600 remax = one / cabs1( work( ii + (nb+k)*n ) )
601 CALL zdscal( n, remax, work( 1 + (nb+k)*n ), 1 )
604 $ work( 1 + (nb+1)*n ), n,
605 $ vl( 1, ki-iv+1 ), ldvl )
615 t( k, k ) = work( k )