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
345 notran = lsame( trans, 'n
' )
346.EQ.
LQUERY = ( LWORK-1 )
348.NOT..AND..NOT.
IF( NOTRAN LSAME( TRANS, 'c
' ) ) THEN
350 ELSE IF( NOTRAN ) THEN
351.LT..OR..GT.
IF( ( IJOB0 ) ( IJOB4 ) ) THEN
358.LE.
ELSE IF( N0 ) THEN
360.LT.
ELSE IF( LDAMAX( 1, M ) ) THEN
362.LT.
ELSE IF( LDBMAX( 1, N ) ) THEN
364.LT.
ELSE IF( LDCMAX( 1, M ) ) THEN
366.LT.
ELSE IF( LDDMAX( 1, M ) ) THEN
368.LT.
ELSE IF( LDEMAX( 1, N ) ) THEN
370.LT.
ELSE IF( LDFMAX( 1, M ) ) THEN
377.EQ..OR..EQ.
IF( IJOB1 IJOB2 ) THEN
378 LWMIN = MAX( 1, 2*M*N )
387.LT..AND..NOT.
IF( LWORKLWMIN LQUERY ) THEN
393 CALL XERBLA( 'ctgsyl', -INFO )
395 ELSE IF( LQUERY ) THEN
401.EQ..OR..EQ.
IF( M0 N0 ) 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.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 CTGSY2( 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( REAL( 2*M*N ) ) / ( DSCALE*SQRT( DSUM ) )
446 DIF = SQRT( REAL( PQ ) ) / ( DSCALE*SQRT( DSUM ) )
449.EQ..AND..EQ.
IF( ISOLVE2 IROUND1 ) 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.EQ..AND..EQ.
ELSE IF( ISOLVE2 IROUND2 ) 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 ),
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(
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 ),
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 )