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 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 clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
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