331 SUBROUTINE slatmt( M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX,
332 $ RANK, KL, KU, PACK, A, LDA, WORK, INFO )
341 INTEGER INFO, KL, KU, LDA, M, MODE, N, RANK
342 CHARACTER DIST, PACK, SYM
345 REAL A( lda, * ), D( * ), WORK( * )
353 parameter( zero = 0.0e0 )
355 parameter( one = 1.0e0 )
357 parameter( twopi = 6.2831853071795864769252867663e+0 )
360 REAL ALPHA, ANGLE, C, DUMMY, EXTRA, S, TEMP
361 INTEGER I, IC, ICOL, IDIST, IENDCH, IINFO, IL, ILDA,
362 $ ioffg, ioffst, ipack, ipackg, ir, ir1, ir2,
363 $ irow, irsign, iskew, isym, isympk, j, jc, jch,
364 $ jkl, jku, jr, k, llb, minlda, mnmin, mr, nc,
366 LOGICAL GIVENS, ILEXTR, ILTEMP, TOPDWN
371 EXTERNAL slarnd, lsame
378 INTRINSIC abs, cos, max, min, mod,
REAL, SIN
389 IF( m.EQ.0 .OR. n.EQ.0 )
394 IF( lsame( dist,
'U' ) )
THEN 396 ELSE IF( lsame( dist,
'S' ) )
THEN 398 ELSE IF( lsame( dist,
'N' ) )
THEN 406 IF( lsame( sym,
'N' ) )
THEN 409 ELSE IF( lsame( sym,
'P' ) )
THEN 412 ELSE IF( lsame( sym,
'S' ) )
THEN 415 ELSE IF( lsame( sym,
'H' ) )
THEN 425 IF( lsame( pack,
'N' ) )
THEN 427 ELSE IF( lsame( pack,
'U' ) )
THEN 430 ELSE IF( lsame( pack,
'L' ) )
THEN 433 ELSE IF( lsame( pack,
'C' ) )
THEN 436 ELSE IF( lsame( pack,
'R' ) )
THEN 439 ELSE IF( lsame( pack,
'B' ) )
THEN 442 ELSE IF( lsame( pack,
'Q' ) )
THEN 445 ELSE IF( lsame( pack,
'Z' ) )
THEN 459 IF( ipack.EQ.5 .OR. ipack.EQ.6 )
THEN 461 ELSE IF( ipack.EQ.7 )
THEN 462 minlda = llb + uub + 1
472 IF(
REAL( llb+uub ).LT.0.3*
REAL( MAX( 1, MR+NC ) ) )
478 IF( lda.LT.m .AND. lda.GE.minlda )
485 ELSE IF( m.NE.n .AND. isym.NE.1 )
THEN 487 ELSE IF( n.LT.0 )
THEN 489 ELSE IF( idist.EQ.-1 )
THEN 491 ELSE IF( isym.EQ.-1 )
THEN 493 ELSE IF( abs( mode ).GT.6 )
THEN 495 ELSE IF( ( mode.NE.0 .AND. abs( mode ).NE.6 ) .AND. cond.LT.one )
498 ELSE IF( kl.LT.0 )
THEN 500 ELSE IF( ku.LT.0 .OR. ( isym.NE.1 .AND. kl.NE.ku ) )
THEN 502 ELSE IF( ipack.EQ.-1 .OR. ( isympk.EQ.1 .AND. isym.EQ.1 ) .OR.
503 $ ( isympk.EQ.2 .AND. isym.EQ.1 .AND. kl.GT.0 ) .OR.
504 $ ( isympk.EQ.3 .AND. isym.EQ.1 .AND. ku.GT.0 ) .OR.
505 $ ( isympk.NE.0 .AND. m.NE.n ) )
THEN 507 ELSE IF( lda.LT.max( 1, minlda ) )
THEN 512 CALL xerbla(
'SLATMT', -info )
519 iseed( i ) = mod( abs( iseed( i ) ), 4096 )
522 IF( mod( iseed( 4 ), 2 ).NE.1 )
523 $ iseed( 4 ) = iseed( 4 ) + 1
529 CALL slatm7( mode, cond, irsign, idist, iseed, d, mnmin, rank,
531 IF( iinfo.NE.0 )
THEN 539 IF( abs( d( 1 ) ).LE.abs( d( rank ) ) )
THEN 545 IF( mode.NE.0 .AND. abs( mode ).NE.6 )
THEN 551 temp = max( temp, abs( d( i ) ) )
554 IF( temp.GT.zero )
THEN 561 CALL sscal( rank, alpha, d, 1 )
574 IF( ipack.GT.4 )
THEN 577 IF( ipack.GT.5 )
THEN 593 CALL slaset(
'Full', lda, n, zero, zero, a, lda )
598 IF( llb.EQ.0 .AND. uub.EQ.0 )
THEN 599 CALL scopy( mnmin, d, 1, a( 1-iskew+ioffst, 1 ), ilda+1 )
600 IF( ipack.LE.2 .OR. ipack.GE.5 )
603 ELSE IF( givens )
THEN 612 IF( ipack.GT.4 )
THEN 618 CALL scopy( mnmin, d, 1, a( 1-iskew+ioffst, 1 ), ilda+1 )
629 DO 130 jr = 1, min( m+jku, n ) + jkl - 1
631 angle = twopi*slarnd( 1, iseed )
634 icol = max( 1, jr-jkl )
636 il = min( n, jr+jku ) + 1 - icol
637 CALL slarot( .true., jr.GT.jkl, .false., il, c,
638 $ s, a( jr-iskew*icol+ioffst, icol ),
639 $ ilda, extra, dummy )
646 DO 120 jch = jr - jkl, 1, -jkl - jku
648 CALL slartg( a( ir+1-iskew*( ic+1 )+ioffst,
649 $ ic+1 ), extra, c, s, dummy )
651 irow = max( 1, jch-jku )
655 CALL slarot( .false., iltemp, .true., il, c, -s,
656 $ a( irow-iskew*ic+ioffst, ic ),
657 $ ilda, temp, extra )
659 CALL slartg( a( irow+1-iskew*( ic+1 )+ioffst,
660 $ ic+1 ), temp, c, s, dummy )
661 icol = max( 1, jch-jku-jkl )
664 CALL slarot( .true., jch.GT.jku+jkl, .true.,
665 $ il, c, -s, a( irow-iskew*icol+
666 $ ioffst, icol ), ilda, extra,
680 DO 160 jc = 1, min( n+jkl, m ) + jku - 1
682 angle = twopi*slarnd( 1, iseed )
685 irow = max( 1, jc-jku )
687 il = min( m, jc+jkl ) + 1 - irow
688 CALL slarot( .false., jc.GT.jku, .false., il, c,
689 $ s, a( irow-iskew*jc+ioffst, jc ),
690 $ ilda, extra, dummy )
697 DO 150 jch = jc - jku, 1, -jkl - jku
699 CALL slartg( a( ir+1-iskew*( ic+1 )+ioffst,
700 $ ic+1 ), extra, c, s, dummy )
702 icol = max( 1, jch-jkl )
706 CALL slarot( .true., iltemp, .true., il, c, -s,
707 $ a( ir-iskew*icol+ioffst, icol ),
708 $ ilda, temp, extra )
710 CALL slartg( a( ir+1-iskew*( icol+1 )+ioffst,
711 $ icol+1 ), temp, c, s, dummy )
712 irow = max( 1, jch-jkl-jku )
715 CALL slarot( .false., jch.GT.jkl+jku, .true.,
716 $ il, c, -s, a( irow-iskew*icol+
717 $ ioffst, icol ), ilda, extra,
738 iendch = min( m, n+jkl ) - 1
739 DO 190 jc = min( m+jku, n ) - 1, 1 - jkl, -1
741 angle = twopi*slarnd( 1, iseed )
744 irow = max( 1, jc-jku+1 )
746 il = min( m, jc+jkl+1 ) + 1 - irow
747 CALL slarot( .false., .false., jc+jkl.LT.m, il,
748 $ c, s, a( irow-iskew*jc+ioffst,
749 $ jc ), ilda, dummy, extra )
755 DO 180 jch = jc + jkl, iendch, jkl + jku
758 CALL slartg( a( jch-iskew*ic+ioffst, ic ),
759 $ extra, c, s, dummy )
762 icol = min( n-1, jch+jku )
763 iltemp = jch + jku.LT.n
765 CALL slarot( .true., ilextr, iltemp, icol+2-ic,
766 $ c, s, a( jch-iskew*ic+ioffst, ic ),
767 $ ilda, extra, temp )
769 CALL slartg( a( jch-iskew*icol+ioffst,
770 $ icol ), temp, c, s, dummy )
771 il = min( iendch, jch+jkl+jku ) + 2 - jch
773 CALL slarot( .false., .true.,
774 $ jch+jkl+jku.LE.iendch, il, c, s,
775 $ a( jch-iskew*icol+ioffst,
776 $ icol ), ilda, temp, extra )
791 iendch = min( n, m+jku ) - 1
792 DO 220 jr = min( n+jkl, m ) - 1, 1 - jku, -1
794 angle = twopi*slarnd( 1, iseed )
797 icol = max( 1, jr-jkl+1 )
799 il = min( n, jr+jku+1 ) + 1 - icol
800 CALL slarot( .true., .false., jr+jku.LT.n, il,
801 $ c, s, a( jr-iskew*icol+ioffst,
802 $ icol ), ilda, dummy, extra )
808 DO 210 jch = jr + jku, iendch, jkl + jku
811 CALL slartg( a( ir-iskew*jch+ioffst, jch ),
812 $ extra, c, s, dummy )
815 irow = min( m-1, jch+jkl )
816 iltemp = jch + jkl.LT.m
818 CALL slarot( .false., ilextr, iltemp, irow+2-ir,
819 $ c, s, a( ir-iskew*jch+ioffst,
820 $ jch ), ilda, extra, temp )
822 CALL slartg( a( irow-iskew*jch+ioffst, jch ),
823 $ temp, c, s, dummy )
824 il = min( iendch, jch+jkl+jku ) + 2 - jch
826 CALL slarot( .true., .true.,
827 $ jch+jkl+jku.LE.iendch, il, c, s,
828 $ a( irow-iskew*jch+ioffst, jch ),
829 $ ilda, temp, extra )
848 IF( ipack.GE.5 )
THEN 854 CALL scopy( mnmin, d, 1, a( 1-iskew+ioffg, 1 ), ilda+1 )
858 irow = max( 1, jc-k )
859 il = min( jc+1, k+2 )
861 temp = a( jc-iskew*( jc+1 )+ioffg, jc+1 )
862 angle = twopi*slarnd( 1, iseed )
865 CALL slarot( .false., jc.GT.k, .true., il, c, s,
866 $ a( irow-iskew*jc+ioffg, jc ), ilda,
868 CALL slarot( .true., .true., .false.,
869 $ min( k, n-jc )+1, c, s,
870 $ a( ( 1-iskew )*jc+ioffg, jc ), ilda,
876 DO 240 jch = jc - k, 1, -k
877 CALL slartg( a( jch+1-iskew*( icol+1 )+ioffg,
878 $ icol+1 ), extra, c, s, dummy )
879 temp = a( jch-iskew*( jch+1 )+ioffg, jch+1 )
880 CALL slarot( .true., .true., .true., k+2, c, -s,
881 $ a( ( 1-iskew )*jch+ioffg, jch ),
882 $ ilda, temp, extra )
883 irow = max( 1, jch-k )
884 il = min( jch+1, k+2 )
886 CALL slarot( .false., jch.GT.k, .true., il, c,
887 $ -s, a( irow-iskew*jch+ioffg, jch ),
888 $ ilda, extra, temp )
897 IF( ipack.NE.ipackg .AND. ipack.NE.3 )
THEN 899 irow = ioffst - iskew*jc
900 DO 270 jr = jc, min( n, jc+uub )
901 a( jr+irow, jc ) = a( jc-iskew*jr+ioffg, jr )
904 IF( ipack.EQ.5 )
THEN 905 DO 300 jc = n - uub + 1, n
906 DO 290 jr = n + 2 - jc, uub + 1
911 IF( ipackg.EQ.6 )
THEN 921 IF( ipack.GE.5 )
THEN 928 CALL scopy( mnmin, d, 1, a( 1-iskew+ioffg, 1 ), ilda+1 )
931 DO 320 jc = n - 1, 1, -1
932 il = min( n+1-jc, k+2 )
934 temp = a( 1+( 1-iskew )*jc+ioffg, jc )
935 angle = twopi*slarnd( 1, iseed )
938 CALL slarot( .false., .true., n-jc.GT.k, il, c, s,
939 $ a( ( 1-iskew )*jc+ioffg, jc ), ilda,
941 icol = max( 1, jc-k+1 )
942 CALL slarot( .true., .false., .true., jc+2-icol, c,
943 $ s, a( jc-iskew*icol+ioffg, icol ),
944 $ ilda, dummy, temp )
949 DO 310 jch = jc + k, n - 1, k
950 CALL slartg( a( jch-iskew*icol+ioffg, icol ),
951 $ extra, c, s, dummy )
952 temp = a( 1+( 1-iskew )*jch+ioffg, jch )
953 CALL slarot( .true., .true., .true., k+2, c, s,
954 $ a( jch-iskew*icol+ioffg, icol ),
955 $ ilda, extra, temp )
956 il = min( n+1-jch, k+2 )
958 CALL slarot( .false., .true., n-jch.GT.k, il, c,
959 $ s, a( ( 1-iskew )*jch+ioffg, jch ),
960 $ ilda, temp, extra )
969 IF( ipack.NE.ipackg .AND. ipack.NE.4 )
THEN 971 irow = ioffst - iskew*jc
972 DO 340 jr = jc, max( 1, jc-uub ), -1
973 a( jr+irow, jc ) = a( jc-iskew*jr+ioffg, jr )
976 IF( ipack.EQ.6 )
THEN 978 DO 360 jr = 1, uub + 1 - jc
983 IF( ipackg.EQ.5 )
THEN 1001 IF( isym.EQ.1 )
THEN 1005 CALL slagge( mr, nc, llb, uub, d, a, lda, iseed, work,
1011 CALL slagsy( m, llb, d, a, lda, iseed, work, iinfo )
1014 IF( iinfo.NE.0 )
THEN 1022 IF( ipack.NE.ipackg )
THEN 1023 IF( ipack.EQ.1 )
THEN 1033 ELSE IF( ipack.EQ.2 )
THEN 1043 ELSE IF( ipack.EQ.3 )
THEN 1052 IF( irow.GT.lda )
THEN 1056 a( irow, icol ) = a( i, j )
1060 ELSE IF( ipack.EQ.4 )
THEN 1069 IF( irow.GT.lda )
THEN 1073 a( irow, icol ) = a( i, j )
1077 ELSE IF( ipack.GE.5 )
THEN 1089 DO 460 i = min( j+llb, m ), 1, -1
1090 a( i-j+uub+1, j ) = a( i, j )
1094 DO 490 j = uub + 2, n
1095 DO 480 i = j - uub, min( j+llb, m )
1096 a( i-j+uub+1, j ) = a( i, j )
1106 IF( ipack.EQ.3 .OR. ipack.EQ.4 )
THEN 1108 DO 500 jr = irow + 1, lda
1114 ELSE IF( ipack.GE.5 )
THEN 1125 DO 520 jr = 1, uub + 1 - jc
1128 DO 530 jr = max( 1, min( ir1, ir2-jc ) ), lda
subroutine slartg(F, G, CS, SN, R)
SLARTG generates a plane rotation with real cosine and real sine.
subroutine slatm7(MODE, COND, IRSIGN, IDIST, ISEED, D, N, RANK, INFO)
SLATM7
subroutine slarot(LROWS, LLEFT, LRIGHT, NL, C, S, A, LDA, XLEFT, XRIGHT)
SLAROT
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slagsy(N, K, D, A, LDA, ISEED, WORK, INFO)
SLAGSY
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine slagge(M, N, KL, KU, D, A, LDA, ISEED, WORK, INFO)
SLAGGE
subroutine slatmt(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, RANK, KL, KU, PACK, A, LDA, WORK, INFO)
SLATMT
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY