292 SUBROUTINE ztgsyl( 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,
304 DOUBLE PRECISION DIF, SCALE
308 COMPLEX*16 A( LDA, * ), B( LDB, * ), C( LDC, * ),
309 $ d( ldd, * ), e( lde, * ), f( ldf, * ),
318 DOUBLE PRECISION ZERO, ONE
319 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
321 parameter( czero = (0.0d+0, 0.0d+0) )
324 LOGICAL LQUERY, NOTRAN
325 INTEGER I, IE, IFUNC, IROUND, IS, ISOLVE, J, , JS, K,
326 $ linfo, lwmin, mb, nb, p, pq, q
327 DOUBLE PRECISION DSCALE, , SCALE2, SCALOC
332 EXTERNAL lsame, ilaenv
338 INTRINSIC dble, dcmplx,
max, 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(
'ZTGSYL', -info )
395 ELSE IF( lquery )
THEN
401 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
413 mb = ilaenv( 2,
'ZTGSYL', trans, m, n, -1, -1 )
414 nb = ilaenv( 5,
'ZTGSYL', trans, m, n, -1, -1 )
421 CALL zlaset(
'F', m, n, czero, czero, c, ldc )
422 CALL zlaset( 'f
', M, N, CZERO, CZERO, F, LDF )
423.GE..AND.
ELSE IF( IJOB1 NOTRAN ) THEN
428.LE..AND..LE..OR..GE..AND..GE.
IF( ( MB1 NB1 ) ( MBM NBN ) )
433 DO 30 IROUND = 1, ISOLVE
439 CALL ZTGSY2( TRANS, IFUNC, M, N, A, LDA, B, LDB, C, LDC, D,
440 $ LDD, E, LDE, F, LDF, SCALE, DSUM, DSCALE,
442.NE.
IF( DSCALEZERO ) THEN
443.EQ..OR..EQ.
IF( IJOB1 IJOB3 ) THEN
444 DIF = SQRT( DBLE( 2*M*N ) ) / ( DSCALE*SQRT( DSUM ) )
446 DIF = SQRT( DBLE( PQ ) ) / ( DSCALE*SQRT( DSUM ) )
449.EQ..AND..EQ.
IF( ISOLVE2 IROUND1 ) THEN
454 CALL ZLACPY( 'f
', M, N, C, LDC, WORK, M )
455 CALL ZLACPY( 'f
', M, N, F, LDF, WORK( M*N+1 ), M )
456 CALL ZLASET( 'f
', M, N, CZERO, CZERO, C, LDC )
457 CALL ZLASET( 'f
', M, N, CZERO, CZERO, F, LDF )
458.EQ..AND..EQ.
ELSE IF( ISOLVE2 IROUND2 ) THEN
459 CALL ZLACPY( 'f
', M, N, WORK, M, C, LDC )
460 CALL ZLACPY( 'f
', M, N, WORK( M*N+1 ), M, F, LDF )
484.EQ.
IF( IWORK( P )IWORK( P+1 ) )
504.EQ.
IF( IWORK( Q )IWORK( Q+1 ) )
508 DO 150 IROUND = 1, ISOLVE
521 JE = IWORK( J+1 ) - 1
525 IE = IWORK( I+1 ) - 1
527 CALL ZTGSY2( 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.NE.
IF( SCALOCONE ) THEN
537 CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ),
539 CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ),
543 CALL ZSCAL( IS-1, DCMPLX( SCALOC, ZERO ),
545 CALL ZSCAL( IS-1, DCMPLX( SCALOC, ZERO ),
549 CALL ZSCAL( M-IE, DCMPLX( SCALOC, ZERO ),
551 CALL ZSCAL( M-IE, DCMPLX( SCALOC, ZERO ),
555 CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ),
557 CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ),
566 CALL ZGEMM( 'n
', 'n
', IS-1, NB, MB,
567 $ DCMPLX( -ONE, ZERO ), A( 1, IS ), LDA,
568 $ C( IS, JS ), LDC, DCMPLX( ONE, ZERO ),
570 CALL ZGEMM( 'n
', 'n
', IS-1, NB, MB,
571 $ DCMPLX( -ONE, ZERO ), D( 1, IS ), LDD,
572 $ C( IS, JS ), LDC, DCMPLX( ONE, ZERO ),
576 CALL ZGEMM( 'n
', 'n
', MB, N-JE, NB,
577 $ DCMPLX( ONE, ZERO ), F( IS, JS ), LDF,
578 $ B( JS, JE+1 ), LDB,
579 $ DCMPLX( ONE, ZERO ), C( IS, JE+1 ),
581 CALL ZGEMM( 'n
', 'n
', MB, N-JE, NB,
582 $ DCMPLX( ONE, ZERO ), F( IS, JS ), LDF,
583 $ E( JS, JE+1 ), LDE,
584 $ DCMPLX( ONE, ZERO ), F( IS, JE+1 ),
589.NE.
IF( DSCALEZERO ) THEN
590.EQ..OR..EQ.
IF( IJOB1 IJOB3 ) THEN
591 DIF = SQRT( DBLE( 2*M*N ) ) / ( DSCALE*SQRT( DSUM ) )
593 DIF = SQRT( DBLE( PQ ) ) / ( DSCALE*SQRT( DSUM ) )
596.EQ..AND..EQ.
IF( ISOLVE2 IROUND1 ) THEN
601 CALL ZLACPY( 'f
', M, N, C, LDC, WORK, M )
602 CALL ZLACPY( 'f
', M, N, F, LDF, WORK( M*N+1 ), M )
603 CALL ZLASET( 'f
', M, N, CZERO, CZERO, C, LDC )
604 CALL ZLASET( 'f
', M, N, CZERO, CZERO, F, LDF )
605.EQ..AND..EQ.
ELSE IF( ISOLVE2 IROUND2 ) THEN
606 CALL ZLACPY( 'f
', M, N, WORK, M, C, LDC )
607 CALL ZLACPY( 'f
', M, N, WORK( M*N+1 ), M, F, LDF )
621 IE = IWORK( I+1 ) - 1
623 DO 200 J = Q, P + 2, -1
625 JE = IWORK( J+1 ) - 1
627 CALL ZTGSY2( TRANS, IFUNC, MB, NB, A( IS, IS ), LDA,
628 $ B( JS, JS ), LDB, C( IS, JS ), LDC,
629 $ D( IS, IS ), LDD, E( JS, JS ), LDE,
630 $ F( IS, JS ), LDF, SCALOC, DSUM, DSCALE,
634.NE.
IF( SCALOCONE ) THEN
636 CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), C( 1, K ),
638 CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), F( 1, K ),
642 CALL ZSCAL( IS-1, DCMPLX( SCALOC, ZERO ),
644 CALL ZSCAL( IS-1, DCMPLX( SCALOC, ZERO ),
648 CALL ZSCAL( M-IE, DCMPLX( SCALOC, ZERO ),
650 CALL ZSCAL( M-IE, DCMPLX( SCALOC, ZERO ),
654 CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), C( 1, K ),
656 CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), F( 1, K ),
665 CALL ZGEMM( 'n
', 'c
', MB, JS-1, NB,
666 $ DCMPLX( ONE, ZERO ), C( IS, JS ), LDC,
667 $ B( 1, JS ), LDB, DCMPLX( ONE, ZERO ),
669 CALL ZGEMM( 'n
', 'c
', MB, JS-1, NB,
670 $ DCMPLX( ONE, ZERO ), F( IS, JS ), LDF,
671 $ E( 1, JS ), LDE, DCMPLX( ONE, ZERO ),
675 CALL ZGEMM( 'c
', 'n
', M-IE, NB, MB,
676 $ DCMPLX( -ONE, ZERO ), A( IS, IE+1 ), LDA,
677 $ C( IS, JS ), LDC, DCMPLX( ONE, ZERO ),
678 $ C( IE+1, JS ), LDC )
679 CALL ZGEMM( 'c
', 'n
', M-IE, NB, MB,
680 $ DCMPLX( -ONE, ZERO ), D( IS, IE+1 ), LDD,
681 $ F( IS, JS ), LDF, DCMPLX( ONE, ZERO ),
682 $ C( IE+1, JS ), LDC )
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(uplo, m, n, alpha, beta, a, lda)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine ztgsy2(trans, ijob, m, n, a, lda, b, ldb, c, ldc, d, ldd, e, lde, f, ldf, scale, rdsum, rdscal, info)
ZTGSY2 solves the generalized Sylvester equation (unblocked algorithm).
subroutine ztgsyl(trans, ijob, m, n, a, lda, b, ldb, c, ldc, d, ldd, e, lde, f, ldf, scale, dif, work, lwork, iwork, info)
ZTGSYL
subroutine zgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
ZGEMM