332 SUBROUTINE clatms( M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX,
333 $ KL, KU, PACK, A, LDA, WORK, INFO )
341 CHARACTER DIST, PACK, SYM
342 INTEGER INFO, KL, KU, LDA, M, MODE, N
348 COMPLEX A( lda, * ), WORK( * )
355 parameter( zero = 0.0e+0 )
357 parameter( one = 1.0e+0 )
359 parameter( czero = ( 0.0e+0, 0.0e+0 ) )
361 parameter( twopi = 6.2831853071795864769252867663e+0 )
364 LOGICAL CSYM, GIVENS, ILEXTR, ILTEMP, TOPDWN
365 INTEGER I, IC, ICOL, IDIST, IENDCH, IINFO, IL, ILDA,
366 $ ioffg, ioffst, ipack, ipackg, ir, ir1, ir2,
367 $ irow, irsign, iskew, isym, isympk, j, jc, jch,
368 $ jkl, jku, jr, k, llb, minlda, mnmin, mr, nc,
370 REAL ALPHA, ANGLE, REALC, TEMP
371 COMPLEX C, CT, CTEMP, DUMMY, EXTRA, S, ST
377 EXTERNAL lsame, slarnd, clarnd
384 INTRINSIC abs, cmplx, conjg, cos, max, min, mod,
REAL,
396 IF( m.EQ.0 .OR. n.EQ.0 )
401 IF( lsame( dist,
'U' ) )
THEN 403 ELSE IF( lsame( dist,
'S' ) )
THEN 405 ELSE IF( lsame( dist,
'N' ) )
THEN 413 IF( lsame( sym,
'N' ) )
THEN 417 ELSE IF( lsame( sym,
'P' ) )
THEN 421 ELSE IF( lsame( sym,
'S' ) )
THEN 425 ELSE IF( lsame( sym,
'H' ) )
THEN 436 IF( lsame( pack,
'N' ) )
THEN 438 ELSE IF( lsame( pack,
'U' ) )
THEN 441 ELSE IF( lsame( pack,
'L' ) )
THEN 444 ELSE IF( lsame( pack,
'C' ) )
THEN 447 ELSE IF( lsame( pack,
'R' ) )
THEN 450 ELSE IF( lsame( pack,
'B' ) )
THEN 453 ELSE IF( lsame( pack,
'Q' ) )
THEN 456 ELSE IF( lsame( pack,
'Z' ) )
THEN 470 IF( ipack.EQ.5 .OR. ipack.EQ.6 )
THEN 472 ELSE IF( ipack.EQ.7 )
THEN 473 minlda = llb + uub + 1
483 IF(
REAL( llb+uub ).LT.0.3*
REAL( MAX( 1, MR+NC ) ) )
489 IF( lda.LT.m .AND. lda.GE.minlda )
496 ELSE IF( m.NE.n .AND. isym.NE.1 )
THEN 498 ELSE IF( n.LT.0 )
THEN 500 ELSE IF( idist.EQ.-1 )
THEN 502 ELSE IF( isym.EQ.-1 )
THEN 504 ELSE IF( abs( mode ).GT.6 )
THEN 506 ELSE IF( ( mode.NE.0 .AND. abs( mode ).NE.6 ) .AND. cond.LT.one )
509 ELSE IF( kl.LT.0 )
THEN 511 ELSE IF( ku.LT.0 .OR. ( isym.NE.1 .AND. kl.NE.ku ) )
THEN 513 ELSE IF( ipack.EQ.-1 .OR. ( isympk.EQ.1 .AND. isym.EQ.1 ) .OR.
514 $ ( isympk.EQ.2 .AND. isym.EQ.1 .AND. kl.GT.0 ) .OR.
515 $ ( isympk.EQ.3 .AND. isym.EQ.1 .AND. ku.GT.0 ) .OR.
516 $ ( isympk.NE.0 .AND. m.NE.n ) )
THEN 518 ELSE IF( lda.LT.max( 1, minlda ) )
THEN 523 CALL xerbla(
'CLATMS', -info )
530 iseed( i ) = mod( abs( iseed( i ) ), 4096 )
533 IF( mod( iseed( 4 ), 2 ).NE.1 )
534 $ iseed( 4 ) = iseed( 4 ) + 1
540 CALL slatm1( mode, cond, irsign, idist, iseed, d, mnmin, iinfo )
541 IF( iinfo.NE.0 )
THEN 549 IF( abs( d( 1 ) ).LE.abs( d( mnmin ) ) )
THEN 555 IF( mode.NE.0 .AND. abs( mode ).NE.6 )
THEN 561 temp = max( temp, abs( d( i ) ) )
564 IF( temp.GT.zero )
THEN 571 CALL sscal( mnmin, alpha, d, 1 )
575 CALL claset(
'Full', lda, n, czero, czero, a, lda )
586 IF( ipack.GT.4 )
THEN 589 IF( ipack.GT.5 )
THEN 609 IF( llb.EQ.0 .AND. uub.EQ.0 )
THEN 611 a( ( 1-iskew )*j+ioffst, j ) = cmplx( d( j ) )
614 IF( ipack.LE.2 .OR. ipack.GE.5 )
617 ELSE IF( givens )
THEN 626 IF( ipack.GT.4 )
THEN 633 a( ( 1-iskew )*j+ioffst, j ) = cmplx( d( j ) )
645 DO 60 jr = 1, min( m+jku, n ) + jkl - 1
647 angle = twopi*slarnd( 1, iseed )
648 c = cos( angle )*clarnd( 5, iseed )
649 s = sin( angle )*clarnd( 5, iseed )
650 icol = max( 1, jr-jkl )
652 il = min( n, jr+jku ) + 1 - icol
653 CALL clarot( .true., jr.GT.jkl, .false., il, c,
654 $ s, a( jr-iskew*icol+ioffst, icol ),
655 $ ilda, extra, dummy )
662 DO 50 jch = jr - jkl, 1, -jkl - jku
664 CALL clartg( a( ir+1-iskew*( ic+1 )+ioffst,
665 $ ic+1 ), extra, realc, s, dummy )
666 dummy = clarnd( 5, iseed )
667 c = conjg( realc*dummy )
668 s = conjg( -s*dummy )
670 irow = max( 1, jch-jku )
674 CALL clarot( .false., iltemp, .true., il, c, s,
675 $ a( irow-iskew*ic+ioffst, ic ),
676 $ ilda, ctemp, extra )
678 CALL clartg( a( irow+1-iskew*( ic+1 )+ioffst,
679 $ ic+1 ), ctemp, realc, s, dummy )
680 dummy = clarnd( 5, iseed )
681 c = conjg( realc*dummy )
682 s = conjg( -s*dummy )
684 icol = max( 1, jch-jku-jkl )
687 CALL clarot( .true., jch.GT.jku+jkl, .true.,
688 $ il, c, s, a( irow-iskew*icol+
689 $ ioffst, icol ), ilda, extra,
703 DO 90 jc = 1, min( n+jkl, m ) + jku - 1
705 angle = twopi*slarnd( 1, iseed )
706 c = cos( angle )*clarnd( 5, iseed )
707 s = sin( angle )*clarnd( 5, iseed )
708 irow = max( 1, jc-jku )
710 il = min( m, jc+jkl ) + 1 - irow
711 CALL clarot( .false., jc.GT.jku, .false., il, c,
712 $ s, a( irow-iskew*jc+ioffst, jc ),
713 $ ilda, extra, dummy )
720 DO 80 jch = jc - jku, 1, -jkl - jku
722 CALL clartg( a( ir+1-iskew*( ic+1 )+ioffst,
723 $ ic+1 ), extra, realc, s, dummy )
724 dummy = clarnd( 5, iseed )
725 c = conjg( realc*dummy )
726 s = conjg( -s*dummy )
728 icol = max( 1, jch-jkl )
732 CALL clarot( .true., iltemp, .true., il, c, s,
733 $ a( ir-iskew*icol+ioffst, icol ),
734 $ ilda, ctemp, extra )
736 CALL clartg( a( ir+1-iskew*( icol+1 )+ioffst,
737 $ icol+1 ), ctemp, realc, s,
739 dummy = clarnd( 5, iseed )
740 c = conjg( realc*dummy )
741 s = conjg( -s*dummy )
742 irow = max( 1, jch-jkl-jku )
745 CALL clarot( .false., jch.GT.jkl+jku, .true.,
746 $ il, c, s, a( irow-iskew*icol+
747 $ ioffst, icol ), ilda, extra,
768 iendch = min( m, n+jkl ) - 1
769 DO 120 jc = min( m+jku, n ) - 1, 1 - jkl, -1
771 angle = twopi*slarnd( 1, iseed )
772 c = cos( angle )*clarnd( 5, iseed )
773 s = sin( angle )*clarnd( 5, iseed )
774 irow = max( 1, jc-jku+1 )
776 il = min( m, jc+jkl+1 ) + 1 - irow
777 CALL clarot( .false., .false., jc+jkl.LT.m, il,
778 $ c, s, a( irow-iskew*jc+ioffst,
779 $ jc ), ilda, dummy, extra )
785 DO 110 jch = jc + jkl, iendch, jkl + jku
788 CALL clartg( a( jch-iskew*ic+ioffst, ic ),
789 $ extra, realc, s, dummy )
790 dummy = clarnd( 5, iseed )
795 icol = min( n-1, jch+jku )
796 iltemp = jch + jku.LT.n
798 CALL clarot( .true., ilextr, iltemp, icol+2-ic,
799 $ c, s, a( jch-iskew*ic+ioffst, ic ),
800 $ ilda, extra, ctemp )
802 CALL clartg( a( jch-iskew*icol+ioffst,
803 $ icol ), ctemp, realc, s, dummy )
804 dummy = clarnd( 5, iseed )
807 il = min( iendch, jch+jkl+jku ) + 2 - jch
809 CALL clarot( .false., .true.,
810 $ jch+jkl+jku.LE.iendch, il, c, s,
811 $ a( jch-iskew*icol+ioffst,
812 $ icol ), ilda, ctemp, extra )
827 iendch = min( n, m+jku ) - 1
828 DO 150 jr = min( n+jkl, m ) - 1, 1 - jku, -1
830 angle = twopi*slarnd( 1, iseed )
831 c = cos( angle )*clarnd( 5, iseed )
832 s = sin( angle )*clarnd( 5, iseed )
833 icol = max( 1, jr-jkl+1 )
835 il = min( n, jr+jku+1 ) + 1 - icol
836 CALL clarot( .true., .false., jr+jku.LT.n, il,
837 $ c, s, a( jr-iskew*icol+ioffst,
838 $ icol ), ilda, dummy, extra )
844 DO 140 jch = jr + jku, iendch, jkl + jku
847 CALL clartg( a( ir-iskew*jch+ioffst, jch ),
848 $ extra, realc, s, dummy )
849 dummy = clarnd( 5, iseed )
854 irow = min( m-1, jch+jkl )
855 iltemp = jch + jkl.LT.m
857 CALL clarot( .false., ilextr, iltemp, irow+2-ir,
858 $ c, s, a( ir-iskew*jch+ioffst,
859 $ jch ), ilda, extra, ctemp )
861 CALL clartg( a( irow-iskew*jch+ioffst, jch ),
862 $ ctemp, realc, s, dummy )
863 dummy = clarnd( 5, iseed )
866 il = min( iendch, jch+jkl+jku ) + 2 - jch
868 CALL clarot( .true., .true.,
869 $ jch+jkl+jku.LE.iendch, il, c, s,
870 $ a( irow-iskew*jch+ioffst, jch ),
871 $ ilda, ctemp, extra )
892 IF( ipack.GE.5 )
THEN 900 a( ( 1-iskew )*j+ioffg, j ) = cmplx( d( j ) )
905 irow = max( 1, jc-k )
906 il = min( jc+1, k+2 )
908 ctemp = a( jc-iskew*( jc+1 )+ioffg, jc+1 )
909 angle = twopi*slarnd( 1, iseed )
910 c = cos( angle )*clarnd( 5, iseed )
911 s = sin( angle )*clarnd( 5, iseed )
916 ctemp = conjg( ctemp )
920 CALL clarot( .false., jc.GT.k, .true., il, c, s,
921 $ a( irow-iskew*jc+ioffg, jc ), ilda,
923 CALL clarot( .true., .true., .false.,
924 $ min( k, n-jc )+1, ct, st,
925 $ a( ( 1-iskew )*jc+ioffg, jc ), ilda,
931 DO 180 jch = jc - k, 1, -k
932 CALL clartg( a( jch+1-iskew*( icol+1 )+ioffg,
933 $ icol+1 ), extra, realc, s, dummy )
934 dummy = clarnd( 5, iseed )
935 c = conjg( realc*dummy )
936 s = conjg( -s*dummy )
937 ctemp = a( jch-iskew*( jch+1 )+ioffg, jch+1 )
942 ctemp = conjg( ctemp )
946 CALL clarot( .true., .true., .true., k+2, c, s,
947 $ a( ( 1-iskew )*jch+ioffg, jch ),
948 $ ilda, ctemp, extra )
949 irow = max( 1, jch-k )
950 il = min( jch+1, k+2 )
952 CALL clarot( .false., jch.GT.k, .true., il, ct,
953 $ st, a( irow-iskew*jch+ioffg, jch ),
954 $ ilda, extra, ctemp )
963 IF( ipack.NE.ipackg .AND. ipack.NE.3 )
THEN 965 irow = ioffst - iskew*jc
967 DO 210 jr = jc, min( n, jc+uub )
968 a( jr+irow, jc ) = a( jc-iskew*jr+ioffg, jr )
971 DO 220 jr = jc, min( n, jc+uub )
972 a( jr+irow, jc ) = conjg( a( jc-iskew*jr+
977 IF( ipack.EQ.5 )
THEN 978 DO 250 jc = n - uub + 1, n
979 DO 240 jr = n + 2 - jc, uub + 1
984 IF( ipackg.EQ.6 )
THEN 994 IF( ipack.GE.5 )
THEN 1003 a( ( 1-iskew )*j+ioffg, j ) = cmplx( d( j ) )
1007 DO 280 jc = n - 1, 1, -1
1008 il = min( n+1-jc, k+2 )
1010 ctemp = a( 1+( 1-iskew )*jc+ioffg, jc )
1011 angle = twopi*slarnd( 1, iseed )
1012 c = cos( angle )*clarnd( 5, iseed )
1013 s = sin( angle )*clarnd( 5, iseed )
1018 ctemp = conjg( ctemp )
1022 CALL clarot( .false., .true., n-jc.GT.k, il, c, s,
1023 $ a( ( 1-iskew )*jc+ioffg, jc ), ilda,
1025 icol = max( 1, jc-k+1 )
1026 CALL clarot( .true., .false., .true., jc+2-icol,
1027 $ ct, st, a( jc-iskew*icol+ioffg,
1028 $ icol ), ilda, dummy, ctemp )
1033 DO 270 jch = jc + k, n - 1, k
1034 CALL clartg( a( jch-iskew*icol+ioffg, icol ),
1035 $ extra, realc, s, dummy )
1036 dummy = clarnd( 5, iseed )
1039 ctemp = a( 1+( 1-iskew )*jch+ioffg, jch )
1044 ctemp = conjg( ctemp )
1048 CALL clarot( .true., .true., .true., k+2, c, s,
1049 $ a( jch-iskew*icol+ioffg, icol ),
1050 $ ilda, extra, ctemp )
1051 il = min( n+1-jch, k+2 )
1053 CALL clarot( .false., .true., n-jch.GT.k, il,
1054 $ ct, st, a( ( 1-iskew )*jch+ioffg,
1055 $ jch ), ilda, ctemp, extra )
1064 IF( ipack.NE.ipackg .AND. ipack.NE.4 )
THEN 1065 DO 320 jc = n, 1, -1
1066 irow = ioffst - iskew*jc
1068 DO 300 jr = jc, max( 1, jc-uub ), -1
1069 a( jr+irow, jc ) = a( jc-iskew*jr+ioffg, jr )
1072 DO 310 jr = jc, max( 1, jc-uub ), -1
1073 a( jr+irow, jc ) = conjg( a( jc-iskew*jr+
1078 IF( ipack.EQ.6 )
THEN 1080 DO 330 jr = 1, uub + 1 - jc
1085 IF( ipackg.EQ.5 )
THEN 1095 IF( .NOT.csym )
THEN 1097 irow = ioffst + ( 1-iskew )*jc
1098 a( irow, jc ) = cmplx(
REAL( A( IROW, JC ) ) )
1113 IF( isym.EQ.1 )
THEN 1117 CALL clagge( mr, nc, llb, uub, d, a, lda, iseed, work,
1125 CALL clagsy( m, llb, d, a, lda, iseed, work, iinfo )
1127 CALL claghe( m, llb, d, a, lda, iseed, work, iinfo )
1131 IF( iinfo.NE.0 )
THEN 1139 IF( ipack.NE.ipackg )
THEN 1140 IF( ipack.EQ.1 )
THEN 1150 ELSE IF( ipack.EQ.2 )
THEN 1160 ELSE IF( ipack.EQ.3 )
THEN 1169 IF( irow.GT.lda )
THEN 1173 a( irow, icol ) = a( i, j )
1177 ELSE IF( ipack.EQ.4 )
THEN 1186 IF( irow.GT.lda )
THEN 1190 a( irow, icol ) = a( i, j )
1194 ELSE IF( ipack.GE.5 )
THEN 1206 DO 440 i = min( j+llb, m ), 1, -1
1207 a( i-j+uub+1, j ) = a( i, j )
1211 DO 470 j = uub + 2, n
1212 DO 460 i = j - uub, min( j+llb, m )
1213 a( i-j+uub+1, j ) = a( i, j )
1223 IF( ipack.EQ.3 .OR. ipack.EQ.4 )
THEN 1225 DO 480 jr = irow + 1, lda
1231 ELSE IF( ipack.GE.5 )
THEN 1242 DO 500 jr = 1, uub + 1 - jc
1245 DO 510 jr = max( 1, min( ir1, ir2-jc ) ), lda
subroutine clarot(LROWS, LLEFT, LRIGHT, NL, C, S, A, LDA, XLEFT, XRIGHT)
CLAROT
subroutine clartg(F, G, CS, SN, R)
CLARTG generates a plane rotation with real cosine and complex sine.
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine clatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
CLATMS
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine clagge(M, N, KL, KU, D, A, LDA, ISEED, WORK, INFO)
CLAGGE
subroutine claghe(N, K, D, A, LDA, ISEED, WORK, INFO)
CLAGHE
subroutine clagsy(N, K, D, A, LDA, ISEED, WORK, INFO)
CLAGSY
subroutine slatm1(MODE, COND, IRSIGN, IDIST, ISEED, D, N, INFO)
SLATM1