242 SUBROUTINE ctrevc3( 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, , LDVL, LDVR, LWORK, LRWORK, M, MM,
257 COMPLEX T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
265 parameter( zero = 0.0e+0, one = 1.0e+0 )
267 parameter( czero = ( 0.0e+0, 0.0e+0 ),
268 $ cone = ( 1.0e+0, 0.0e+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 REAL , REMAX, SCALE, SMIN, SMLNUM, ULP, UNFL
282 EXTERNAL lsame, ilaenv,
icamax, slamch, scasum
289 INTRINSIC abs, real,
cmplx, conjg, aimag,
max
295 cabs1( cdum ) = abs( real( cdum ) ) + abs( aimag( 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,
'CTREVC', 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(
'CTREVC3', -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 claset(
'F', n, 1+2*nb, czero, czero, work, n )
372 unfl = slamch(
'Safe minimum' )
375 ulp = slamch(
'Precision' )
376 smlnum = unfl*( n / ulp )
381 work( i ) = t( i, i )
389 rwork( j ) = scasum( 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 )
425 t( k, k ) = t( k, k ) - t( ki, ki )
426 IF( cabs1( t( k, k ) ).LT.smin )
431 CALL clatrs(
'Upper',
'No transpose',
'Non-unit',
'Y',
432 $ ki-1, t, ldt, work( 1 + iv*n ), scale,
434 work( ki + iv*n ) = scale
442 CALL ccopy( ki, work( 1 + iv*n ), 1, vr( 1, is ), 1 )
444 ii =
icamax( ki, vr( 1, is ), 1
445 remax = one / cabs1( vr( ii, is ) )
446 CALL csscal( ki, remax, vr( 1, is ), 1 )
452 ELSE IF( nb.EQ.1 )
THEN
456 $
CALL cgemv(
'N', n, ki-1, cone, vr, ldvr,
457 $ work( 1 + iv*n ), 1,
cmplx( scale ),
460 ii =
icamax( n, vr( 1, ki ), 1 )
461 remax = one / cabs1( vr( ii, ki ) )
462 CALL csscal( n, remax, vr( 1, ki ), 1 )
469 work( k + iv*n ) = czero
475 IF( (iv.EQ.1) .OR. (ki.EQ.1) )
THEN
476 CALL cgemm( 'n
', 'n
', N, NB-IV+1, KI+NB-IV, CONE,
478 $ WORK( 1 + (IV)*N ), N,
480 $ WORK( 1 + (NB+IV)*N ), N )
483 II = ICAMAX( N, WORK( 1 + (NB+K)*N ), 1 )
484 REMAX = ONE / CABS1( WORK( II + (NB+K)*N ) )
485 CALL CSSCAL( N, REMAX, WORK( 1 + (NB+K)*N ), 1 )
487 CALL CLACPY( 'f
', N, NB-IV+1,
488 $ WORK( 1 + (NB+IV)*N ), N,
489 $ VR( 1, KI ), LDVR )
499 T( K, K ) = WORK( K )
520.NOT.
IF( 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.LT.
IF( CABS1( T( K, K ) )SMIN )
546 CALL CLATRS( '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 CCOPY( N-KI+1, WORK( KI + IV*N ), 1, VL(KI,IS), 1 )
559 II = ICAMAX( N-KI+1, VL( KI, IS ), 1 ) + KI - 1
560 REMAX = ONE / CABS1( VL( II, IS ) )
561 CALL CSSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
567.EQ.
ELSE IF( NB1 ) THEN
571 $ CALL CGEMV( 'n
', N, N-KI, CONE, VL( 1, KI+1 ), LDVL,
572 $ WORK( KI+1 + IV*N ), 1, CMPLX( SCALE ),
575 II = ICAMAX( N, VL( 1, KI ), 1 )
576 REMAX = ONE / CABS1( VL( II, KI ) )
577 CALL CSSCAL( N, REMAX, VL( 1, KI ), 1 )
585 WORK( K + IV*N ) = CZERO
591.EQ..OR..EQ.
IF( (IVNB) (KIN) ) THEN
592 CALL CGEMM( '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 = ICAMAX( N, WORK( 1 + (NB+K)*N ), 1 )
600 REMAX = ONE / CABS1( WORK( II + (NB+K)*N ) )
601 CALL CSSCAL( N, REMAX, WORK( 1 + (NB+K)*N ), 1 )
603 CALL CLACPY( 'f
', N, IV,
604 $ WORK( 1 + (NB+1)*N ), N,
605 $ VL( 1, KI-IV+1 ), LDVL )
615 T( K, K ) = WORK( K )
subroutine ctrevc3(side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, mm, m, work, lwork, rwork, lrwork, info)
CTREVC3