294 SUBROUTINE dtgsyl( TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC,
296 $ LDD, E, LDE, F, LDF, SCALE, DIF, WORK, LWORK,
305 INTEGER IJOB, INFO, LDA, LDB, LDC, LDD, LDE, LDF,
307 DOUBLE PRECISION DIF, SCALE
311 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), C( LDC, * ),
312 $ D( LDD, * ), E( LDE, * ), F( LDF, * ),
321 DOUBLE PRECISION ZERO, ONE
322 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
325 LOGICAL LQUERY, NOTRAN
326 INTEGER I, IE, IFUNC, IROUND, IS, ISOLVE, J, JE, JS, K,
327 $ LINFO, LWMIN, MB, NB, P, PPQQ, PQ, Q
328 DOUBLE PRECISION DSCALE, DSUM, SCALE2, SCALOC
333 EXTERNAL LSAME, ILAENV
340 INTRINSIC dble, max, sqrt
347 notran = lsame( trans,
'N' )
348 lquery = ( lwork.EQ.-1 )
350 IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) )
THEN
352 ELSE IF( notran )
THEN
353 IF( ( ijob.LT.0 ) .OR. ( ijob.GT.4 ) )
THEN
360 ELSE IF( n.LE.0 )
THEN
362 ELSE IF( lda.LT.max( 1, m ) )
THEN
364 ELSE IF( ldb.LT.max( 1, n ) )
THEN
366 ELSE IF( ldc.LT.max( 1, m ) )
THEN
368 ELSE IF( ldd.LT.max( 1, m ) )
THEN
370 ELSE IF( lde.LT.max( 1, n ) )
THEN
372 ELSE IF( ldf.LT.max( 1, m ) )
THEN
379 IF( ijob.EQ.1 .OR. ijob.EQ.2 )
THEN
380 lwmin = max( 1, 2*m*n )
389 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
395 CALL xerbla(
'DTGSYL', -info )
397 ELSE IF( lquery )
THEN
403 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
415 mb = ilaenv( 2,
'DTGSYL', trans, m, n, -1, -1 )
416 nb = ilaenv( 5,
'DTGSYL', trans, m, n, -1, -1 )
423 CALL dlaset(
'F', m, n, zero, zero, c, ldc )
424 CALL dlaset(
'F', m, n, zero, zero, f, ldf )
425 ELSE IF( ijob.GE.1 )
THEN
430 IF( ( mb.LE.1 .AND. nb.LE.1 ) .OR. ( mb.GE.m .AND. nb.GE.n ) )
433 DO 30 iround = 1, isolve
440 CALL dtgsy2( 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( dble( 2*m*n ) ) / ( dscale*sqrt( dsum ) )
448 dif = sqrt( dble( pq ) ) / ( dscale*sqrt( dsum ) )
452 IF( isolve.EQ.2 .AND. iround.EQ.1 )
THEN
457 CALL dlacpy(
'F', m, n, c, ldc, work, m )
458 CALL dlacpy(
'F', m, n, f, ldf, work( m*n+1 ), m )
459 CALL dlaset(
'F', m, n, zero, zero, c, ldc )
460 CALL dlaset(
'F', m, n, zero, zero, f, ldf )
461 ELSE IF( isolve.EQ.2 .AND. iround.EQ.2 )
THEN
462 CALL dlacpy(
'F', m, n, work, m, c, ldc )
463 CALL dlacpy(
'F', m, n, work( m*n+1 ), m, f, ldf )
483 IF( a( i, i-1 ).NE.zero )
489 IF( iwork( p ).EQ.iwork( p+1 ) )
504 IF( b( j, j-1 ).NE.zero )
510 IF( iwork( q ).EQ.iwork( q+1 ) )
515 DO 150 iround = 1, isolve
528 je = iwork( j+1 ) - 1
532 ie = iwork( i+1 ) - 1
535 CALL dtgsy2( trans, ifunc, mb, nb, a( is, is ),
537 $ b( js, js ), ldb, c( is, js ), ldc,
538 $ d( is, is ), ldd, e( js, js ), lde,
539 $ f( is, js ), ldf, scaloc, dsum, dscale,
540 $ iwork( q+2 ), ppqq, linfo )
545 IF( scaloc.NE.one )
THEN
547 CALL dscal( m, scaloc, c( 1, k ), 1 )
548 CALL dscal( m, scaloc, f( 1, k ), 1 )
551 CALL dscal( is-1, scaloc, c( 1, k ), 1 )
552 CALL dscal( is-1, scaloc, f( 1, k ), 1 )
555 CALL dscal( m-ie, scaloc, c( ie+1, k ), 1 )
556 CALL dscal( m-ie, scaloc, f( ie+1, k ), 1 )
559 CALL dscal( m, scaloc, c( 1, k ), 1 )
560 CALL dscal( m, scaloc, f( 1, k ), 1 )
569 CALL dgemm(
'N',
'N', is-1, nb, mb, -one,
570 $ a( 1, is ), lda, c( is, js ), ldc, one,
572 CALL dgemm(
'N',
'N', is-1, nb, mb, -one,
573 $ d( 1, is ), ldd, c( is, js ), ldc, one,
577 CALL dgemm(
'N',
'N', mb, n-je, nb, one,
578 $ f( is, js ), ldf, b( js, je+1 ), ldb,
579 $ one, c( is, je+1 ), ldc )
580 CALL dgemm(
'N',
'N', mb, n-je, nb, one,
581 $ f( is, js ), ldf, e( js, je+1 ), lde,
582 $ one, f( is, je+1 ), ldf )
586 IF( dscale.NE.zero )
THEN
587 IF( ijob.EQ.1 .OR. ijob.EQ.3 )
THEN
588 dif = sqrt( dble( 2*m*n ) ) / ( dscale*sqrt( dsum ) )
590 dif = sqrt( dble( pq ) ) / ( dscale*sqrt( dsum ) )
593 IF( isolve.EQ.2 .AND. iround.EQ.1 )
THEN
598 CALL dlacpy(
'F', m, n, c, ldc, work, m )
599 CALL dlacpy(
'F', m, n, f, ldf, work( m*n+1 ), m )
600 CALL dlaset(
'F', m, n, zero, zero, c, ldc )
601 CALL dlaset(
'F', m, n, zero, zero, f, ldf )
602 ELSE IF( isolve.EQ.2 .AND. iround.EQ.2 )
THEN
603 CALL dlacpy(
'F', m, n, work, m, c, ldc )
604 CALL dlacpy(
'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 dtgsy2( 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,
629 $ iwork( q+2 ), ppqq, linfo )
632 IF( scaloc.NE.one )
THEN
634 CALL dscal( m, scaloc, c( 1, k ), 1 )
635 CALL dscal( m, scaloc, f( 1, k ), 1 )
638 CALL dscal( is-1, scaloc, c( 1, k ), 1 )
639 CALL dscal( is-1, scaloc, f( 1, k ), 1 )
642 CALL dscal( m-ie, scaloc, c( ie+1, k ), 1 )
643 CALL dscal( m-ie, scaloc, f( ie+1, k ), 1 )
646 CALL dscal( m, scaloc, c( 1, k ), 1 )
647 CALL dscal( m, scaloc, f( 1, k ), 1 )
655 CALL dgemm(
'N',
'T', mb, js-1, nb, one, c( is,
657 $ ldc, b( 1, js ), ldb, one, f( is, 1 ),
659 CALL dgemm(
'N',
'T', mb, js-1, nb, one, f( is,
661 $ ldf, e( 1, js ), lde, one, f( is, 1 ),
665 CALL dgemm(
'T',
'N', m-ie, nb, mb, -one,
666 $ a( is, ie+1 ), lda, c( is, js ), ldc, one,
667 $ c( ie+1, js ), ldc )
668 CALL dgemm(
'T',
'N', m-ie, nb, mb, -one,
669 $ d( is, ie+1 ), ldd, f( is, js ), ldf, one,
670 $ c( ie+1, js ), ldc )