310 SUBROUTINE strsen( JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, WR,
312 $ M, S, SEP, WORK, LWORK, IWORK, LIWORK, INFO )
320 INTEGER INFO, LDQ, LDT, LIWORK, LWORK, M, N
326 REAL Q( LDQ, * ), T( LDT, * ), WI( * ), WORK( * ),
334 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
337 LOGICAL LQUERY, PAIR, SWAP, WANTBH, WANTQ, WANTS,
339 INTEGER IERR, K, KASE, KK, KS, LIWMIN, LWMIN, N1, N2,
341 REAL EST, RNORM, SCALE
348 REAL SLANGE, SROUNDUP_LWORK
349 EXTERNAL lsame, slange, sroundup_lwork
356 INTRINSIC abs, max, sqrt
362 wantbh = lsame( job,
'B' )
363 wants = lsame( job,
'E' ) .OR. wantbh
364 wantsp = lsame( job,
'V' ) .OR. wantbh
365 wantq = lsame( compq,
'V' )
368 lquery = ( lwork.EQ.-1 )
369 IF( .NOT.lsame( job,
'N' ) .AND. .NOT.wants .AND. .NOT.wantsp )
372 ELSE IF( .NOT.lsame( compq,
'N' ) .AND. .NOT.wantq )
THEN
374 ELSE IF( n.LT.0 )
THEN
376 ELSE IF( ldt.LT.max( 1, n ) )
THEN
378 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN
392 IF( t( k+1, k ).EQ.zero )
THEN
397 IF(
SELECT( k ) .OR.
SELECT( k+1 ) )
412 lwmin = max( 1, 2*nn )
413 liwmin = max( 1, nn )
414 ELSE IF( lsame( job,
'N' ) )
THEN
417 ELSE IF( lsame( job,
'E' ) )
THEN
422 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
424 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
430 work( 1 ) = sroundup_lwork(lwmin)
435 CALL xerbla(
'STRSEN', -info )
437 ELSE IF( lquery )
THEN
443 IF( m.EQ.n .OR. m.EQ.0 )
THEN
447 $ sep = slange(
'1', n, n, t, ldt, work )
461 IF( t( k+1, k ).NE.zero )
THEN
463 swap = swap .OR.
SELECT( k+1 )
474 $
CALL strexc( compq, n, t, ldt, q, ldq, kk, ks,
477 IF( ierr.EQ.1 .OR. ierr.EQ.2 )
THEN
500 CALL slacpy(
'F', n1, n2, t( 1, n1+1 ), ldt, work, n1 )
501 CALL strsyl(
'N',
'N', -1, n1, n2, t, ldt, t( n1+1, n1+1 ),
502 $ ldt, work, n1, scale, ierr )
507 rnorm = slange(
'F', n1, n2, work, n1, work )
508 IF( rnorm.EQ.zero )
THEN
511 s = scale / ( sqrt( scale*scale / rnorm+rnorm )*
523 CALL slacn2( nn, work( nn+1 ), work, iwork, est, kase,
530 CALL strsyl(
'N',
'N', -1, n1, n2, t, ldt,
531 $ t( n1+1, n1+1 ), ldt, work, n1, scale,
537 CALL strsyl(
'T',
'T', -1, n1, n2, t, ldt,
538 $ t( n1+1, n1+1 ), ldt, work, n1, scale,
556 IF( t( k+1, k ).NE.zero )
THEN
557 wi( k ) = sqrt( abs( t( k, k+1 ) ) )*
558 $ sqrt( abs( t( k+1, k ) ) )
563 work( 1 ) = sroundup_lwork(lwmin)
subroutine strsen(job, compq, select, n, t, ldt, q, ldq, wr, wi, m, s, sep, work, lwork, iwork, liwork, info)
STRSEN
subroutine strsyl(trana, tranb, isgn, m, n, a, lda, b, ldb, c, ldc, scale, info)
STRSYL