162 SUBROUTINE dtrsyl( TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C,
170 CHARACTER TRANA, TRANB
171 INTEGER INFO, ISGN, LDA, LDB, LDC, M, N
172 DOUBLE PRECISION SCALE
175 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), C( LDC, * )
181 DOUBLE PRECISION ZERO, ONE
182 parameter( zero = 0.0d+0, one = 1.0d+0 )
185 LOGICAL NOTRNA, NOTRNB
186 INTEGER IERR, J, K, K1, K2, KNEXT, L, L1, L2, LNEXT
187 DOUBLE PRECISION A11, BIGNUM, DA11, DB, EPS, SCALOC, SGN, SMIN,
188 $ smlnum, suml, sumr, xnorm
191 DOUBLE PRECISION DUM( 1 ), VEC( 2, 2 ), X( 2, 2 )
195 DOUBLE PRECISION DDOT, DLAMCH, DLANGE
196 EXTERNAL lsame, ddot, dlamch, dlange
202 INTRINSIC abs, dble,
max,
min
208 notrna = lsame( trana,
'N' )
209 notrnb = lsame( tranb,
'N' )
212 IF( .NOT.notrna .AND. .NOT.lsame( trana,
'T' ) .AND. .NOT.
213 $ lsame( trana,
'C' ) )
THEN
215 ELSE IF( .NOT.notrnb .AND. .NOT.lsame( tranb,
'T' ) .AND. .NOT.
216 $ lsame( tranb,
'C' ) )
THEN
218 ELSE IF( isgn.NE.1 .AND. isgn.NE.-1 )
THEN
220 ELSE IF( m.LT.0 )
THEN
222 ELSE IF( n.LT.0 )
THEN
224 ELSE IF( lda.LT.
max( 1, m ) )
THEN
226 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
228 ELSE IF( ldc.LT.
max( 1, m ) )
THEN
232 CALL xerbla(
'DTRSYL', -info )
239 IF( m.EQ.0 .OR. n.EQ.0 )
245 smlnum = dlamch(
'S' )
246 bignum = one / smlnum
247 CALL dlabad( smlnum, bignum )
248 smlnum = smlnum*dble( m*n ) / eps
249 bignum = one / smlnum
251 smin =
max( smlnum, eps*dlange(
'M', m, m, a, lda, dum ),
252 $ eps*dlange(
'M', n, n, b, ldb, dum ) )
256 IF( notrna .AND. notrnb )
THEN
281 IF( b( l+1, l ).NE.zero )
THEN
303 IF( a( k, k-1 ).NE.zero )
THEN
314 IF( l1.EQ.l2 .AND. k1.EQ.k2 )
THEN
315 suml = ddot( m-k1, a( k1,
min( k1+1, m ) ), lda,
316 $ c(
min( k1+1, m ), l1 ), 1 )
317 sumr = ddot( l1-1, c( k1, 1 ), ldc, b( 1, l1 ), 1 )
318 vec( 1, 1 ) = c( k1, l1 ) - ( suml+sgn*sumr )
321 a11 = a( k1, k1 ) + sgn*b( l1, l1 )
323 IF( da11.LE.smin )
THEN
328 db = abs( vec( 1, 1 ) )
329 IF( da11.LT.one .AND. db.GT.one )
THEN
330 IF( db.GT.bignum*da11 )
333 x( 1, 1 ) = ( vec( 1, 1 )*scaloc ) / a11
335 IF( scaloc.NE.one )
THEN
337 CALL dscal( m, scaloc, c( 1, j ), 1 )
341 c( k1, l1 ) = x( 1, 1 )
343 ELSE IF( l1.EQ.l2 .AND. k1.NE.k2 )
THEN
345 suml = ddot( m-k2, a( k1,
min( k2+1, m ) ), lda,
346 $ c(
min( k2+1, m ), l1 ), 1 )
347 sumr = ddot( l1-1, c( k1, 1 ), ldc, b( 1, l1 ), 1 )
348 vec( 1, 1 ) = c( k1, l1 ) - ( suml+sgn*sumr )
350 suml = ddot( m-k2, a( k2,
min( k2+1, m ) ), lda,
351 $ c(
min( k2+1, m ), l1 ), 1 )
352 sumr = ddot( l1-1, c( k2, 1 ), ldc, b( 1, l1 ), 1 )
353 vec( 2, 1 ) = c( k2, l1 ) - ( suml+sgn*sumr )
355 CALL dlaln2( .false., 2, 1, smin, one, a( k1, k1 ),
356 $ lda, one, one, vec, 2, -sgn*b( l1, l1 ),
357 $ zero, x, 2, scaloc, xnorm, ierr )
361 IF( scaloc.NE.one )
THEN
363 CALL dscal( m, scaloc, c( 1, j ), 1 )
367 c( k1, l1 ) = x( 1, 1 )
368 c( k2, l1 ) = x( 2, 1 )
370 ELSE IF( l1.NE.l2 .AND. k1.EQ.k2 )
THEN
372 suml = ddot( m-k1, a( k1,
min( k1+1, m ) ), lda,
373 $ c(
min( k1+1, m ), l1 ), 1 )
374 sumr = ddot( l1-1, c( k1, 1 ), ldc, b( 1, l1 ), 1 )
375 vec( 1, 1 ) = sgn*( c( k1, l1 )-( suml+sgn*sumr ) )
377 suml = ddot( m-k1, a( k1,
min( k1+1, m ) ), lda,
378 $ c(
min( k1+1, m ), l2 ), 1 )
379 sumr = ddot( l1-1, c( k1, 1 ), ldc, b( 1, l2 ), 1 )
382 CALL dlaln2( .true., 2, 1, smin, one, b( l1, l1 ),
383 $ ldb, one, one, vec, 2, -sgn*a( k1, k1 ),
384 $ zero, x, 2, scaloc, xnorm, ierr )
388 IF( scaloc.NE.one )
THEN
390 CALL dscal( m, scaloc, c( 1, j ), 1 )
394 c( k1, l1 ) = x( 1, 1 )
395 c( k1, l2 ) = x( 2, 1 )
397 ELSE IF( l1.NE.l2 .AND. k1.NE.k2 )
THEN
399 suml = ddot( m-k2, a( k1,
min( k2+1, m ) ), lda,
400 $ c(
min( k2+1, m ), l1 ), 1 )
401 sumr = ddot( l1-1, c( k1, 1 ), ldc, b( 1, l1 ), 1 )
402 vec( 1, 1 ) = c( k1, l1 ) - ( suml+sgn*sumr )
404 suml = ddot( m-k2, a( k1,
min( k2+1, m ) ), lda,
405 $ c(
min( k2+1, m ), l2 ), 1 )
406 sumr = ddot( l1-1, c( k1, 1 ), ldc, b( 1, l2 ), 1 )
407 vec( 1, 2 ) = c( k1, l2 ) - ( suml+sgn*sumr )
409 suml = ddot( m-k2, a( k2,
min( k2+1, m ) ), lda,
410 $ c(
min( k2+1, m ), l1 ), 1 )
411 sumr = ddot( l1-1, c( k2, 1 ), ldc, b( 1, l1 ), 1 )
412 vec( 2, 1 ) = c( k2, l1 ) - ( suml+sgn*sumr )
414 suml = ddot( m-k2, a( k2,
min( k2+1, m ) ), lda,
415 $ c(
min( k2+1, m ), l2 ), 1 )
416 sumr = ddot( l1-1, c( k2, 1 ), ldc, b( 1, l2 ), 1 )
417 vec( 2, 2 ) = c( k2, l2 ) - ( suml+sgn*sumr )
419 CALL dlasy2( .false., .false., isgn, 2, 2,
420 $ a( k1, k1 ), lda, b( l1, l1 ), ldb, vec,
421 $ 2, scaloc, x, 2, xnorm, ierr )
425 IF( scaloc.NE.one )
THEN
431 c( k1, l1 ) = x( 1, 1 )
432 c( k1, l2 ) = x( 1, 2 )
433 c( k2, l1 ) = x( 2, 1 )
434 c( k2, l2 ) = x( 2, 2 )
441 ELSE IF( .NOT.notrna .AND. notrnb )
THEN
466 IF( b( l+1, l ).NE.zero )
THEN
488 IF( a( k+1, k ).NE.zero )
THEN
499 IF( l1.EQ.l2 .AND. k1.EQ.k2 )
THEN
500 suml = ddot( k1-1, a( 1, k1 ), 1, c( 1, l1 ), 1 )
501 sumr = ddot( l1-1, c( k1, 1 ), ldc, b( 1, l1 ), 1 )
502 vec( 1, 1 ) = c( k1, l1 ) - ( suml+sgn*sumr )
505 a11 = a( k1, k1 ) + sgn*b( l1, l1 )
507 IF( da11.LE.smin )
THEN
512 db = abs( vec( 1, 1 ) )
513 IF( da11.LT.one .AND. db.GT.one )
THEN
514 IF( db.GT.bignum*da11 )
517 x( 1, 1 ) = ( vec( 1,
519 IF( scaloc.NE.one )
THEN
521 CALL dscal( m, scaloc, c( 1, j ), 1 )
525 c( k1, l1 ) = x( 1, 1 )
527 ELSE IF( l1.EQ.l2 .AND. k1.NE.k2 )
THEN
529 suml = ddot( k1-1, a( 1, k1 ), 1, c( 1, l1 ), 1 )
530 sumr = ddot( l1-1, c( k1, 1 ), ldc, b( 1, l1 ), 1 )
531 vec( 1, 1 ) = c( k1, l1 ) - ( suml+sgn*sumr )
534 sumr = ddot( l1-1, c( k2, 1 ), ldc, b( 1, l1 ), 1 )
535 vec( 2, 1 ) = c( k2, l1 ) - ( suml+sgn*sumr )
537 CALL dlaln2( .true., 2, 1, smin, one, a( k1, k1 ),
538 $ lda, one, one, vec, 2, -sgn*b( l1, l1 ),
539 $ zero, x, 2, scaloc, xnorm, ierr )
543 IF( scaloc.NE.one )
THEN
545 CALL dscal( m, scaloc, c( 1, j ), 1 )
549 c( k1, l1 ) = x( 1, 1 )
550 c( k2, l1 ) = x( 2, 1 )
552 ELSE IF( l1.NE.l2 .AND. k1.EQ.k2 )
THEN
554 suml = ddot( k1-1, a( 1, k1 ), 1, c( 1, l1 ), 1 )
555 sumr = ddot( l1-1, c( k1, 1 ), ldc, b( 1, l1 ), 1 )
556 vec( 1, 1 ) = sgn*( c( k1, l1 )-( suml+sgn*sumr ) )
558 suml = ddot( k1-1, a( 1, k1 ), 1, c( 1, l2 ), 1 )
559 sumr = ddot( l1-1, c( k1, 1 ), ldc, b( 1, l2 ), 1 )
560 vec( 2, 1 ) = sgn*( c( k1, l2 )-( suml+sgn*sumr ) )
562 CALL dlaln2( .true., 2, 1, smin, one, b( l1, l1 ),
563 $ ldb, one, one, vec, 2, -sgn*a( k1, k1 ),
564 $ zero, x, 2, scaloc, xnorm, ierr )
568 IF( scaloc.NE.one )
THEN
570 CALL dscal( m, scaloc, c( 1, j ), 1 )
574 c( k1, l1 ) = x( 1, 1 )
575 c( k1, l2 ) = x( 2, 1 )
577 ELSE IF( l1.NE.l2 .AND. k1.NE.k2 )
THEN
579 suml = ddot( k1-1, a( 1, k1 ), 1, c( 1, l1 ), 1 )
580 sumr = ddot( l1-1, c( k1, 1 ), ldc, b( 1, l1 ), 1 )
581 vec( 1, 1 ) = c( k1, l1 ) - ( suml+sgn*sumr )
583 suml = ddot( k1-1, a( 1, k1 ), 1, c( 1, l2 ), 1 )
584 sumr = ddot( l1-1, c( k1, 1 ), ldc, b( 1, l2 ), 1 )
585 vec( 1, 2 ) = c( k1, l2 ) - ( suml+sgn*sumr )
587 suml = ddot( k1-1, a( 1, k2 ), 1, c( 1, l1 ), 1 )
588 sumr = ddot( l1-1, c( k2, 1 ), ldc, b( 1, l1 ), 1 )
589 vec( 2, 1 ) = c( k2, l1 ) - ( suml+sgn*sumr )
591 suml = ddot( k1-1, a( 1, k2 ), 1, c( 1, l2 ), 1 )
592 sumr = ddot( l1-1, c( k2, 1 ), ldc, b( 1, l2 ), 1 )
593 vec( 2, 2 ) = c( k2, l2 ) - ( suml+sgn*sumr )
595 CALL dlasy2( .true., .false., isgn, 2, 2, a( k1, k1 ),
596 $ lda, b( l1, l1 ), ldb, vec, 2, scaloc, x,
601 IF( scaloc.NE.one )
THEN
603 CALL dscal( m, scaloc, c( 1, j ), 1 )
607 c( k1, l1 ) = x( 1, 1 )
608 c( k1, l2 ) = x( 1, 2 )
609 c( k2, l1 ) = x( 2, 1 )
610 c( k2, l2 ) = x( 2, 2 )
616 ELSE IF( .NOT.notrna .AND. .NOT.notrnb )
THEN
641 IF( b( l, l-1 ).NE.zero )
THEN
663 IF( a( k+1, k ).NE.zero )
THEN
675 suml = ddot( k1-1, a( 1, k1 ), 1, c( 1, l1 ), 1 )
676 sumr = ddot( n-l1, c( k1,
min( l1+1, n ) ), ldc,
677 $ b( l1,
min( l1+1, n ) ), ldb )
678 vec( 1, 1 ) = c( k1, l1 ) - ( suml+sgn*sumr )
681 a11 = a( k1, k1 ) + sgn*b( l1, l1 )
683 IF( da11.LE.smin )
THEN
688 db = abs( vec( 1, 1 ) )
689 IF( da11.LT.one .AND. db.GT.one )
THEN
690 IF( db.GT.bignum*da11
693 x( 1, 1 ) = ( vec( 1, 1 )*scaloc ) / a11
695 IF( scaloc.NE.one )
THEN
697 CALL dscal( m, scaloc, c( 1, j ), 1 )
701 c( k1, l1 ) = x( 1, 1 )
703 ELSE IF( l1.EQ.l2 .AND. k1.NE.k2 )
THEN
705 suml = ddot( k1-1, a( 1, k1 ), 1, c( 1, l1 ), 1 )
706 sumr = ddot( n-l2, c( k1,
min( l2+1, n ) ), ldc,
707 $ b( l1,
min( l2+1, n ) ), ldb )
708 vec( 1, 1 ) = c( k1, l1 ) - ( suml+sgn*sumr )
710 suml = ddot( k1-1, a( 1, k2 ), 1, c( 1, l1 ), 1 )
711 sumr = ddot( n-l2, c( k2,
min( l2+1, n ) ), ldc,
712 $ b( l1,
min( l2+1, n ) ), ldb )
713 vec( 2, 1 ) = c( k2, l1 ) - ( suml+sgn*sumr )
715 CALL dlaln2( .true., 2, 1, smin, one, a( k1, k1 ),
716 $ lda, one, one, vec, 2, -sgn*b( l1, l1 ),
717 $ zero, x, 2, scaloc, xnorm, ierr )
721 IF( scaloc.NE.one )
THEN
723 CALL dscal( m, scaloc, c
727 c( k1, l1 ) = x( 1, 1 )
728 c( k2, l1 ) = x( 2, 1 )
730 ELSE IF( l1.NE.l2 .AND. k1.EQ.k2 )
THEN
732 suml = ddot( k1-1, a( 1, k1 ), 1, c( 1, l1 ), 1 )
734 $ b( l1,
min( l2+1, n ) ), ldb )
735 vec( 1, 1 ) = sgn*( c( k1, l1 )-( suml+sgn*sumr ) )
737 suml = ddot( k1-1, a( 1, k1 ), 1, c( 1, l2 ), 1 )
738 sumr = ddot( n-l2, c( k1,
min( l2+1, n ) ), ldc,
739 $ b( l2,
min( l2+1, n ) ), ldb )
740 vec( 2, 1 ) = sgn*( c( k1, l2 )-( suml+sgn*sumr ) )
742 CALL dlaln2( .false., 2, 1, smin, one, b( l1, l1 ),
743 $ ldb, one, one, vec, 2, -sgn*a( k1, k1 ),
744 $ zero, x, 2, scaloc, xnorm, ierr )
748 IF( scaloc.NE.one )
THEN
750 CALL dscal( m, scaloc, c( 1, j ), 1 )
754 c( k1, l1 ) = x( 1, 1 )
755 c( k1, l2 ) = x( 2, 1 )
757 ELSE IF( l1.NE.l2 .AND. k1.NE.k2 )
THEN
759 suml = ddot( k1-1, a( 1, k1 ), 1, c( 1, l1 ), 1 )
760 sumr = ddot( n-l2, c( k1,
min( l2+1, n ) ), ldc,
761 $ b( l1,
min( l2+1, n ) ), ldb )
762 vec( 1, 1 ) = c( k1, l1 ) - ( suml+sgn*sumr )
764 suml = ddot( k1-1, a( 1, k1 ), 1, c( 1, l2 ), 1 )
765 sumr = ddot( n-l2, c( k1,
min( l2+1, n ) ), ldc,
766 $ b( l2,
min( l2+1, n ) ), ldb )
767 vec( 1, 2 ) = c( k1, l2 ) - ( suml+sgn*sumr )
769 suml = ddot( k1-1, a( 1, k2 ), 1, c( 1, l1 ), 1 )
770 sumr = ddot( n-l2, c( k2,
min( l2+1, n ) ), ldc,
771 $ b( l1,
min( l2+1, n ) ), ldb )
772 vec( 2, 1 ) = c( k2, l1 ) - ( suml+sgn*sumr )
774 suml = ddot( k1-1, a( 1, k2 ), 1, c( 1, l2 ), 1 )
775 sumr = ddot( n-l2, c( k2,
min( l2+1, n ) ), ldc,
777 vec( 2, 2 ) = c( k2, l2 ) - ( suml
779 CALL dlasy2( .true., .true., isgn, 2, 2, a( k1, k1 ),
780 $ lda, b( l1, l1 ), ldb, vec, 2, scaloc, x,
785 IF( scaloc.NE.one )
THEN
787 CALL dscal( m, scaloc, c( 1, j ), 1 )
791 c( k1, l1 ) = x( 1, 1 )
792 c( k1, l2 ) = x( 1, 2 )
794 c( k2, l2 ) = x( 2, 2 )
800 ELSE IF( notrna .AND. .NOT.notrnb )
THEN
825 IF( b( l, l-1 ).NE.zero )
THEN
847 IF( a( k, k-1 ).NE.zero )
THEN
858 IF( l1.EQ.l2 .AND. k1.EQ.k2 )
THEN
859 suml = ddot( m-k1, a( k1,
min( k1+1, m ) ), lda,
860 $ c(
min( k1+1, m ), l1 ), 1 )
861 sumr = ddot( n-l1, c( k1,
min( l1+1, n ) ), ldc,
862 $ b( l1,
min( l1+1, n ) ), ldb )
863 vec( 1, 1 ) = c( k1, l1 ) - ( suml+sgn*sumr )
866 a11 = a( k1, k1 ) + sgn*b( l1, l1 )
868 IF( da11.LE.smin )
THEN
873 db = abs( vec( 1, 1 ) )
874 IF( da11.LT.one .AND. db.GT.one )
THEN
875 IF( db.GT.bignum*da11 )
878 x( 1, 1 ) = ( vec( 1, 1 )*scaloc ) / a11
880 IF( scaloc.NE.one )
THEN
882 CALL dscal( m, scaloc, c( 1, j ), 1 )
886 c( k1, l1 ) = x( 1, 1 )
888 ELSE IF( l1.EQ.l2 .AND. k1.NE.k2 )
THEN
890 suml = ddot( m-k2, a( k1,
min( k2+1, m ) ), lda,
891 $ c(
min( k2+1, m ), l1 ), 1 )
892 sumr = ddot( n-l2, c( k1,
min( l2+1, n ) ), ldc,
894 vec( 1, 1 ) = c( k1, l1 ) - ( suml+sgn*sumr )
896 suml = ddot( m-k2, a( k2,
min( k2+1, m ) ), lda,
897 $ c(
min( k2+1, m ), l1 ), 1 )
898 sumr = ddot( n-l2, c( k2,
min( l2+1, n ) ), ldc,
899 $ b( l1,
min( l2+1, n ) ), ldb )
900 vec( 2, 1 ) = c( k2, l1 ) - ( suml+sgn*sumr )
902 CALL dlaln2( .false., 2, 1, smin, one, a( k1, k1 ),
903 $ lda, one, one, vec, 2, -sgn*b( l1, l1 ),
908 IF( scaloc.NE.one )
THEN
910 CALL dscal( m, scaloc, c( 1,
914 c( k1, l1 ) = x( 1, 1 )
915 c( k2, l1 ) = x( 2, 1 )
917 ELSE IF( l1.NE.l2 .AND. k1.EQ.k2 )
THEN
919 suml = ddot( m-k1, a( k1,
min( k1+1, m ) ), lda,
920 $ c(
min( k1+1, m ), l1 ), 1 )
921 sumr = ddot( n-l2, c( k1,
min( l2+1, n ) ), ldc,
922 $ b( l1,
min( l2+1, n ) ), ldb )
923 vec( 1, 1 ) = sgn*( c( k1, l1 )-( suml+sgn*sumr ) )
925 suml = ddot( m-k1, a( k1,
min( k1+1, m ) ), lda,
926 $ c(
min( k1+1, m ), l2 ), 1 )
927 sumr = ddot( n-l2, c( k1,
min( l2+1, n ) ), ldc,
928 $ b( l2,
min( l2+1, n ) ), ldb )
929 vec( 2, 1 ) = sgn*( c( k1, l2 )-( suml+sgn*sumr ) )
931 CALL dlaln2( .false., 2, 1, smin, one, b( l1, l1 ),
932 $ ldb, one, one, vec, 2, -sgn*a( k1, k1 ),
933 $ zero, x, 2, scaloc, xnorm, ierr )
937 IF( scaloc.NE.one )
THEN
939 CALL dscal( m, scaloc, c( 1, j ), 1 )
943 c( k1, l1 ) = x( 1, 1 )
944 c( k1, l2 ) = x( 2, 1 )
946 ELSE IF( l1.NE.l2 .AND. k1.NE.k2 )
THEN
948 suml = ddot( m-k2, a( k1,
min( k2+1, m ) ), lda,
949 $ c(
min( k2+1, m ), l1 ), 1 )
950 sumr = ddot( n-l2, c( k1,
min( l2+1, n ) ), ldc,
951 $ b( l1,
min( l2+1, n ) ), ldb )
952 vec( 1, 1 ) = c( k1, l1 ) - ( suml+sgn*sumr )
954 suml = ddot( m-k2, a( k1,
min( k2+1, m ) ), lda,
955 $ c(
min( k2+1, m ), l2 ), 1 )
956 sumr = ddot( n-l2, c( k1,
min( l2+1, n ) ), ldc,
957 $ b( l2,
min( l2+1, n ) ), ldb )
958 vec( 1, 2 ) = c( k1, l2 ) - ( suml+sgn*sumr )
960 suml = ddot( m-k2, a( k2,
min( k2+1, m ) ), lda,
961 $ c(
min( k2+1, m ), l1 ), 1 )
962 sumr = ddot( n-l2, c( k2,
min( l2+1, n ) ), ldc,
963 $ b( l1,
min( l2+1, n ) ), ldb )
964 vec( 2, 1 ) = c( k2, l1 ) - ( suml+sgn*sumr )
966 suml = ddot( m-k2, a( k2,
min( k2+1, m ) ), lda,
967 $ c(
min( k2+1, m ), l2 ), 1 )
968 sumr = ddot( n-l2, c( k2,
min( l2+1, n ) ), ldc,
969 $ b( l2,
min( l2+1, n ) ), ldb )
970 vec( 2, 2 ) = c( k2, l2 ) - ( suml+sgn*sumr )
972 CALL dlasy2( .false., .true., isgn, 2, 2, a( k1, k1 ),
973 $ lda, b( l1, l1 ), ldb, vec, 2, scaloc, x,
978 IF( scaloc.NE.one )
THEN
980 CALL dscal( m, scaloc, c( 1, j ), 1 )
984 c( k1, l1 ) = x( 1, 1 )
985 c( k1, l2 ) = x( 1, 2 )
986 c( k2, l1 ) = x( 2, 1 )
987 c( k2, l2 ) = x( 2, 2 )