292 SUBROUTINE ctgsyl( TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC, D,
293 $ LDD, E, LDE, F, LDF, SCALE, DIF, WORK, LWORK,
302 INTEGER IJOB, INFO, LDA, LDB, LDC, LDD, LDE, LDF,
308 COMPLEX A( lda, * ), B( ldb, * ), C( ldc, * ),
309 $ d( ldd, * ), e( lde, * ), f( ldf, * ),
319 parameter( zero = 0.0e+0, one = 1.0e+0 )
321 parameter( czero = (0.0e+0, 0.0e+0) )
324 LOGICAL LQUERY, NOTRAN
325 INTEGER I, IE, IFUNC, IROUND, IS, ISOLVE, J, JE, JS, K,
326 $ linfo, lwmin, mb, nb, p, pq, q
327 REAL DSCALE, DSUM, SCALE2, SCALOC
332 EXTERNAL lsame, ilaenv
338 INTRINSIC cmplx, max,
REAL, SQRT
345 notran = lsame( trans,
'N' )
346 lquery = ( lwork.EQ.-1 )
348 IF( .NOT.notran .AND. .NOT.lsame( trans,
'C' ) )
THEN 350 ELSE IF( notran )
THEN 351 IF( ( ijob.LT.0 ) .OR. ( ijob.GT.4 ) )
THEN 358 ELSE IF( n.LE.0 )
THEN 360 ELSE IF( lda.LT.max( 1, m ) )
THEN 362 ELSE IF( ldb.LT.max( 1, n ) )
THEN 364 ELSE IF( ldc.LT.max( 1, m ) )
THEN 366 ELSE IF( ldd.LT.max( 1, m ) )
THEN 368 ELSE IF( lde.LT.max( 1, n ) )
THEN 370 ELSE IF( ldf.LT.max( 1, m ) )
THEN 377 IF( ijob.EQ.1 .OR. ijob.EQ.2 )
THEN 378 lwmin = max( 1, 2*m*n )
387 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN 393 CALL xerbla(
'CTGSYL', -info )
395 ELSE IF( lquery )
THEN 401 IF( m.EQ.0 .OR. n.EQ.0 )
THEN 413 mb = ilaenv( 2,
'CTGSYL', trans, m, n, -1, -1 )
414 nb = ilaenv( 5,
'CTGSYL', trans, m, n, -1, -1 )
421 CALL claset(
'F', m, n, czero, czero, c, ldc )
422 CALL claset(
'F', m, n, czero, czero, f, ldf )
423 ELSE IF( ijob.GE.1 .AND. notran )
THEN 428 IF( ( mb.LE.1 .AND. nb.LE.1 ) .OR. ( mb.GE.m .AND. nb.GE.n ) )
433 DO 30 iround = 1, isolve
439 CALL ctgsy2( trans, ifunc, m, n, a, lda, b, ldb, c, ldc, d,
440 $ ldd, e, lde, f, ldf, scale, dsum, dscale,
442 IF( dscale.NE.zero )
THEN 443 IF( ijob.EQ.1 .OR. ijob.EQ.3 )
THEN 444 dif = sqrt(
REAL( 2*M*N ) ) / ( DSCALE*SQRT( dsum ) )
446 dif = sqrt(
REAL( PQ ) ) / ( DSCALE*SQRT( dsum ) )
449 IF( isolve.EQ.2 .AND. iround.EQ.1 )
THEN 454 CALL clacpy(
'F', m, n, c, ldc, work, m )
455 CALL clacpy(
'F', m, n, f, ldf, work( m*n+1 ), m )
456 CALL claset(
'F', m, n, czero, czero, c, ldc )
457 CALL claset(
'F', m, n, czero, czero, f, ldf )
458 ELSE IF( isolve.EQ.2 .AND. iround.EQ.2 )
THEN 459 CALL clacpy(
'F', m, n, work, m, c, ldc )
460 CALL clacpy(
'F', m, n, work( m*n+1 ), m, f, ldf )
484 IF( iwork( p ).EQ.iwork( p+1 ) )
504 IF( iwork( q ).EQ.iwork( q+1 ) )
508 DO 150 iround = 1, isolve
521 je = iwork( j+1 ) - 1
525 ie = iwork( i+1 ) - 1
527 CALL ctgsy2( trans, ifunc, mb, nb, a( is, is ), lda,
528 $ b( js, js ), ldb, c( is, js ), ldc,
529 $ d( is, is ), ldd, e( js, js ), lde,
530 $ f( is, js ), ldf, scaloc, dsum, dscale,
535 IF( scaloc.NE.one )
THEN 537 CALL cscal( m, cmplx( scaloc, zero ), c( 1, k ),
539 CALL cscal( m, cmplx( scaloc, zero ), f( 1, k ),
543 CALL cscal( is-1, cmplx( scaloc, zero ),
545 CALL cscal( is-1, cmplx( scaloc, zero ),
549 CALL cscal( m-ie, cmplx( scaloc, zero ),
551 CALL cscal( m-ie, cmplx( scaloc, zero ),
555 CALL cscal( m, cmplx( scaloc, zero ), c( 1, k ),
557 CALL cscal( m, cmplx( scaloc, zero ), f( 1, k ),
566 CALL cgemm(
'N',
'N', is-1, nb, mb,
567 $ cmplx( -one, zero ), a( 1, is ), lda,
568 $ c( is, js ), ldc, cmplx( one, zero ),
570 CALL cgemm(
'N',
'N', is-1, nb, mb,
571 $ cmplx( -one, zero ), d( 1, is ), ldd,
572 $ c( is, js ), ldc, cmplx( one, zero ),
576 CALL cgemm(
'N',
'N', mb, n-je, nb,
577 $ cmplx( one, zero ), f( is, js ), ldf,
578 $ b( js, je+1 ), ldb, cmplx( one, zero ),
579 $ c( is, je+1 ), ldc )
580 CALL cgemm(
'N',
'N', mb, n-je, nb,
581 $ cmplx( one, zero ), f( is, js ), ldf,
582 $ e( js, je+1 ), lde, cmplx( one, zero ),
583 $ f( is, je+1 ), ldf )
587 IF( dscale.NE.zero )
THEN 588 IF( ijob.EQ.1 .OR. ijob.EQ.3 )
THEN 589 dif = sqrt(
REAL( 2*M*N ) ) / ( DSCALE*SQRT( dsum ) )
591 dif = sqrt(
REAL( PQ ) ) / ( DSCALE*SQRT( dsum ) )
594 IF( isolve.EQ.2 .AND. iround.EQ.1 )
THEN 599 CALL clacpy(
'F', m, n, c, ldc, work, m )
600 CALL clacpy(
'F', m, n, f, ldf, work( m*n+1 ), m )
601 CALL claset(
'F', m, n, czero, czero, c, ldc )
602 CALL claset(
'F', m, n, czero, czero, f, ldf )
603 ELSE IF( isolve.EQ.2 .AND. iround.EQ.2 )
THEN 604 CALL clacpy(
'F', m, n, work, m, c, ldc )
605 CALL clacpy(
'F', m, n, work( m*n+1 ), m, f, ldf )
619 ie = iwork( i+1 ) - 1
621 DO 200 j = q, p + 2, -1
623 je = iwork( j+1 ) - 1
625 CALL ctgsy2( trans, ifunc, mb, nb, a( is, is ), lda,
626 $ b( js, js ), ldb, c( is, js ), ldc,
627 $ d( is, is ), ldd, e( js, js ), lde,
628 $ f( is, js ), ldf, scaloc, dsum, dscale,
632 IF( scaloc.NE.one )
THEN 634 CALL cscal( m, cmplx( scaloc, zero ), c( 1, k ),
636 CALL cscal( m, cmplx( scaloc, zero ), f( 1, k ),
640 CALL cscal( is-1, cmplx( scaloc, zero ), c( 1, k ),
642 CALL cscal( is-1, cmplx( scaloc, zero ), f( 1, k ),
646 CALL cscal( m-ie, cmplx( scaloc, zero ),
648 CALL cscal( m-ie, cmplx( scaloc, zero ),
652 CALL cscal( m, cmplx( scaloc, zero ), c( 1, k ),
654 CALL cscal( m, cmplx( scaloc, zero ), f( 1, k ),
663 CALL cgemm(
'N',
'C', mb, js-1, nb,
664 $ cmplx( one, zero ), c( is, js ), ldc,
665 $ b( 1, js ), ldb, cmplx( one, zero ),
667 CALL cgemm(
'N',
'C', mb, js-1, nb,
668 $ cmplx( one, zero ), f( is, js ), ldf,
669 $ e( 1, js ), lde, cmplx( one, zero ),
673 CALL cgemm(
'C',
'N', m-ie, nb, mb,
674 $ cmplx( -one, zero ), a( is, ie+1 ), lda,
675 $ c( is, js ), ldc, cmplx( one, zero ),
676 $ c( ie+1, js ), ldc )
677 CALL cgemm(
'C',
'N', m-ie, nb, mb,
678 $ cmplx( -one, zero ), d( is, ie+1 ), ldd,
679 $ f( is, js ), ldf, cmplx( one, zero ),
680 $ c( ie+1, js ), ldc )
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine cscal(N, CA, CX, INCX)
CSCAL
subroutine cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine ctgsy2(TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC, D, LDD, E, LDE, F, LDF, SCALE, RDSUM, RDSCAL, INFO)
CTGSY2 solves the generalized Sylvester equation (unblocked algorithm).
subroutine ctgsyl(TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC, D, LDD, E, LDE, F, LDF, SCALE, DIF, WORK, LWORK, IWORK, INFO)
CTGSYL