290 SUBROUTINE ctgsyl( TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC,
292 $ LDD, E, LDE, F, LDF, SCALE, DIF, WORK, LWORK,
301 INTEGER IJOB, INFO, LDA, LDB, LDC, LDD, LDE, LDF,
307 COMPLEX A( LDA, * ), B( LDB, * ), C( LDC, * ),
308 $ D( LDD, * ), E( LDE, * ), F( LDF, * ),
318 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
320 parameter( czero = (0.0e+0, 0.0e+0) )
323 LOGICAL LQUERY, NOTRAN
324 INTEGER I, IE, IFUNC, IROUND, IS, ISOLVE, J, JE, JS, K,
325 $ LINFO, LWMIN, MB, NB, P, PQ, Q
326 REAL DSCALE, DSUM, SCALE2, SCALOC
332 EXTERNAL lsame, ilaenv, sroundup_lwork
339 INTRINSIC cmplx, max, real, sqrt
346 notran = lsame( trans,
'N' )
347 lquery = ( lwork.EQ.-1 )
349 IF( .NOT.notran .AND. .NOT.lsame( trans,
'C' ) )
THEN
351 ELSE IF( notran )
THEN
352 IF( ( ijob.LT.0 ) .OR. ( ijob.GT.4 ) )
THEN
359 ELSE IF( n.LE.0 )
THEN
361 ELSE IF( lda.LT.max( 1, m ) )
THEN
363 ELSE IF( ldb.LT.max( 1, n ) )
THEN
365 ELSE IF( ldc.LT.max( 1, m ) )
THEN
367 ELSE IF( ldd.LT.max( 1, m ) )
THEN
369 ELSE IF( lde.LT.max( 1, n ) )
THEN
371 ELSE IF( ldf.LT.max( 1, m ) )
THEN
378 IF( ijob.EQ.1 .OR. ijob.EQ.2 )
THEN
379 lwmin = max( 1, 2*m*n )
386 work( 1 ) = sroundup_lwork(lwmin)
388 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
394 CALL xerbla(
'CTGSYL', -info )
396 ELSE IF( lquery )
THEN
402 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
414 mb = ilaenv( 2,
'CTGSYL', trans, m, n, -1, -1 )
415 nb = ilaenv( 5,
'CTGSYL', trans, m, n, -1, -1 )
422 CALL claset(
'F', m, n, czero, czero, c, ldc )
423 CALL claset(
'F', m, n, czero, czero, f, ldf )
424 ELSE IF( ijob.GE.1 .AND. notran )
THEN
429 IF( ( mb.LE.1 .AND. nb.LE.1 ) .OR. ( mb.GE.m .AND. nb.GE.n ) )
434 DO 30 iround = 1, isolve
440 CALL ctgsy2( trans, ifunc, m, n, a, lda, b, ldb, c, ldc,
442 $ ldd, e, lde, f, ldf, scale, dsum, dscale,
444 IF( dscale.NE.zero )
THEN
445 IF( ijob.EQ.1 .OR. ijob.EQ.3 )
THEN
446 dif = sqrt( real( 2*m*n ) ) / ( dscale*sqrt( dsum ) )
448 dif = sqrt( real( pq ) ) / ( dscale*sqrt( dsum ) )
451 IF( isolve.EQ.2 .AND. iround.EQ.1 )
THEN
456 CALL clacpy(
'F', m, n, c, ldc, work, m )
457 CALL clacpy(
'F', m, n, f, ldf, work( m*n+1 ), m )
458 CALL claset(
'F', m, n, czero, czero, c, ldc )
459 CALL claset(
'F', m, n, czero, czero, f, ldf )
460 ELSE IF( isolve.EQ.2 .AND. iround.EQ.2 )
THEN
461 CALL clacpy(
'F', m, n, work, m, c, ldc )
462 CALL clacpy(
'F', m, n, work( m*n+1 ), m, f, ldf )
486 IF( iwork( p ).EQ.iwork( p+1 ) )
506 IF( iwork( q ).EQ.iwork( q+1 ) )
510 DO 150 iround = 1, isolve
523 je = iwork( j+1 ) - 1
527 ie = iwork( i+1 ) - 1
529 CALL ctgsy2( trans, ifunc, mb, nb, a( is, is ),
531 $ b( js, js ), ldb, c( is, js ), ldc,
532 $ d( is, is ), ldd, e( js, js ), lde,
533 $ f( is, js ), ldf, scaloc, dsum, dscale,
538 IF( scaloc.NE.one )
THEN
540 CALL cscal( m, cmplx( scaloc, zero ), c( 1,
543 CALL cscal( m, cmplx( scaloc, zero ), f( 1,
548 CALL cscal( is-1, cmplx( scaloc, zero ),
550 CALL cscal( is-1, cmplx( scaloc, zero ),
554 CALL cscal( m-ie, cmplx( scaloc, zero ),
556 CALL cscal( m-ie, cmplx( scaloc, zero ),
560 CALL cscal( m, cmplx( scaloc, zero ), c( 1,
563 CALL cscal( m, cmplx( scaloc, zero ), f( 1,
573 CALL cgemm(
'N',
'N', is-1, nb, mb,
574 $ cmplx( -one, zero ), a( 1, is ), lda,
575 $ c( is, js ), ldc, cmplx( one, zero ),
577 CALL cgemm(
'N',
'N', is-1, nb, mb,
578 $ cmplx( -one, zero ), d( 1, is ), ldd,
579 $ c( is, js ), ldc, cmplx( one, zero ),
583 CALL cgemm(
'N',
'N', mb, n-je, nb,
584 $ cmplx( one, zero ), f( is, js ), ldf,
585 $ b( js, je+1 ), ldb, cmplx( one, zero ),
586 $ c( is, je+1 ), ldc )
587 CALL cgemm(
'N',
'N', mb, n-je, nb,
588 $ cmplx( one, zero ), f( is, js ), ldf,
589 $ e( js, je+1 ), lde, cmplx( one, zero ),
590 $ f( is, je+1 ), ldf )
594 IF( dscale.NE.zero )
THEN
595 IF( ijob.EQ.1 .OR. ijob.EQ.3 )
THEN
596 dif = sqrt( real( 2*m*n ) ) / ( dscale*sqrt( dsum ) )
598 dif = sqrt( real( pq ) ) / ( dscale*sqrt( dsum ) )
601 IF( isolve.EQ.2 .AND. iround.EQ.1 )
THEN
606 CALL clacpy(
'F', m, n, c, ldc, work, m )
607 CALL clacpy(
'F', m, n, f, ldf, work( m*n+1 ), m )
608 CALL claset(
'F', m, n, czero, czero, c, ldc )
609 CALL claset(
'F', m, n, czero, czero, f, ldf )
610 ELSE IF( isolve.EQ.2 .AND. iround.EQ.2 )
THEN
611 CALL clacpy(
'F', m, n, work, m, c, ldc )
612 CALL clacpy(
'F', m, n, work( m*n+1 ), m, f, ldf )
626 ie = iwork( i+1 ) - 1
628 DO 200 j = q, p + 2, -1
630 je = iwork( j+1 ) - 1
632 CALL ctgsy2( trans, ifunc, mb, nb, a( is, is ), lda,
633 $ b( js, js ), ldb, c( is, js ), ldc,
634 $ d( is, is ), ldd, e( js, js ), lde,
635 $ f( is, js ), ldf, scaloc, dsum, dscale,
639 IF( scaloc.NE.one )
THEN
641 CALL cscal( m, cmplx( scaloc, zero ), c( 1, k ),
643 CALL cscal( m, cmplx( scaloc, zero ), f( 1, k ),
647 CALL cscal( is-1, cmplx( scaloc, zero ), c( 1,
650 CALL cscal( is-1, cmplx( scaloc, zero ), f( 1,
655 CALL cscal( m-ie, cmplx( scaloc, zero ),
657 CALL cscal( m-ie, cmplx( scaloc, zero ),
661 CALL cscal( m, cmplx( scaloc, zero ), c( 1, k ),
663 CALL cscal( m, cmplx( scaloc, zero ), f( 1, k ),
672 CALL cgemm(
'N',
'C', mb, js-1, nb,
673 $ cmplx( one, zero ), c( is, js ), ldc,
674 $ b( 1, js ), ldb, cmplx( one, zero ),
676 CALL cgemm(
'N',
'C', mb, js-1, nb,
677 $ cmplx( one, zero ), f( is, js ), ldf,
678 $ e( 1, js ), lde, cmplx( one, zero ),
682 CALL cgemm(
'C',
'N', m-ie, nb, mb,
683 $ cmplx( -one, zero ), a( is, ie+1 ), lda,
684 $ c( is, js ), ldc, cmplx( one, zero ),
685 $ c( ie+1, js ), ldc )
686 CALL cgemm(
'C',
'N', m-ie, nb, mb,
687 $ cmplx( -one, zero ), d( is, ie+1 ), ldd,
688 $ f( is, js ), ldf, cmplx( one, zero ),
689 $ c( ie+1, js ), ldc )
695 work( 1 ) = sroundup_lwork(lwmin)