1 SUBROUTINE dlatms( M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX,
2 $ kl, ku, pack, a, lda, work, info )
9 CHARACTER dist, pack, sym
10 INTEGER info, kl, ku, lda, m, mode, n
11 DOUBLE PRECISION cond, dmax
15 DOUBLE PRECISION a( lda, * ), d( * ), work( * )
253 DOUBLE PRECISION zero
254 parameter( zero = 0.0d0 )
256 parameter( one = 1.0d0 )
257 DOUBLE PRECISION twopi
258 parameter( twopi = 6.2831853071795864769252867663d+0 )
261 LOGICAL givens, ilextr, iltemp, topdwn
262 INTEGER i, ic, icol, idist, iendch, iinfo, il, ilda,
263 $ ioffg, ioffst, ipack, ipackg, ir, ir1, ir2,
264 $ irow, irsign, iskew, isym, isympk, j, jc, jch,
265 $ jkl, jku, jr, k, llb, minlda, mnmin, mr, nc,
267 DOUBLE PRECISION alpha, angle, c, dummy, extra, s, temp
279 INTRINSIC abs, cos, dble,
max,
min, mod, sin
290 IF( m.EQ.0 .OR. n.EQ.0 )
295 IF( lsame( dist,
'U' ) )
THEN
297 ELSE IF( lsame( dist,
'S' ) )
THEN
299 ELSE IF( lsame( dist,
'N' ) )
THEN
307 IF( lsame( sym,
'N' ) )
THEN
310 ELSE IF( lsame( sym,
'P' ) )
THEN
313 ELSE IF( lsame( sym,
'S' ) )
THEN
316 ELSE IF( lsame( sym,
'H' ) )
THEN
326 IF( lsame( pack,
'N' ) )
THEN
328 ELSE IF( lsame( pack,
'U' ) )
THEN
331 ELSE IF( lsame( pack,
'L' ) )
THEN
334 ELSE IF( lsame( pack,
'C' ) )
THEN
337 ELSE IF( lsame( pack,
'R' ) )
THEN
340 ELSE IF( lsame( pack,
'B' ) )
THEN
343 ELSE IF( lsame( pack,
'Q' ) )
THEN
346 ELSE IF( lsame( pack,
'Z' ) )
THEN
360 IF( ipack.EQ.5 .OR. ipack.EQ.6 )
THEN
362 ELSE IF( ipack.EQ.7 )
THEN
363 minlda = llb + uub + 1
373 IF( dble( llb+uub ).LT.0.3d0*dble(
max( 1, mr+nc ) ) )
379 IF( lda.LT.m .AND. lda.GE.minlda )
386 ELSE IF( m.NE.n .AND. isym.NE.1 )
THEN
388 ELSE IF( n.LT.0 )
THEN
390 ELSE IF( idist.EQ.-1 )
THEN
392 ELSE IF( isym.EQ.-1 )
THEN
394 ELSE IF( abs( mode ).GT.6 )
THEN
396 ELSE IF( ( mode.NE.0 .AND. abs( mode ).NE.6 ) .AND. cond.LT.one )
399 ELSE IF( kl.LT.0 )
THEN
401 ELSE IF( ku.LT.0 .OR. ( isym.NE.1 .AND. kl.NE.ku ) )
THEN
403 ELSE IF( ipack.EQ.-1 .OR. ( isympk.EQ.1 .AND. isym.EQ.1 ) .OR.
404 $ ( isympk.EQ.2 .AND. isym.EQ.1 .AND. kl.GT.0 ) .OR.
405 $ ( isympk.EQ.3 .AND. isym.EQ.1 .AND. ku.GT.0 ) .OR.
406 $ ( isympk.NE.0 .AND. m.NE.n ) )
THEN
408 ELSE IF( lda.LT.
max( 1, minlda ) )
THEN
413 CALL
xerbla(
'DLATMS', -info )
420 iseed( i ) = mod( abs( iseed( i ) ), 4096 )
423 IF( mod( iseed( 4 ), 2 ).NE.1 )
424 $ iseed( 4 ) = iseed( 4 ) + 1
430 CALL
dlatm1( mode, cond, irsign, idist, iseed, d, mnmin, iinfo )
431 IF( iinfo.NE.0 )
THEN
439 IF( abs( d( 1 ) ).LE.abs( d( mnmin ) ) )
THEN
445 IF( mode.NE.0 .AND. abs( mode ).NE.6 )
THEN
451 temp =
max( temp, abs( d( i ) ) )
454 IF( temp.GT.zero )
THEN
461 CALL dscal( mnmin, alpha, d, 1 )
474 IF( ipack.GT.4 )
THEN
477 IF( ipack.GT.5 )
THEN
493 CALL
dlaset(
'Full', lda, n, zero, zero, a, lda )
498 IF( llb.EQ.0 .AND. uub.EQ.0 )
THEN
499 CALL dcopy( mnmin, d, 1, a( 1-iskew+ioffst, 1 ), ilda+1 )
500 IF( ipack.LE.2 .OR. ipack.GE.5 )
503 ELSE IF( givens )
THEN
512 IF( ipack.GT.4 )
THEN
518 CALL dcopy( mnmin, d, 1, a( 1-iskew+ioffst, 1 ), ilda+1 )
529 DO 40 jr = 1,
min( m+jku, n ) + jkl - 1
531 angle = twopi*
dlarnd( 1, iseed )
534 icol =
max( 1, jr-jkl )
536 il =
min( n, jr+jku ) + 1 - icol
537 CALL
dlarot( .true., jr.GT.jkl, .false., il, c,
538 $ s, a( jr-iskew*icol+ioffst, icol ),
539 $ ilda, extra, dummy )
546 DO 30 jch = jr - jkl, 1, -jkl - jku
548 CALL
dlartg( a( ir+1-iskew*( ic+1 )+ioffst,
549 $ ic+1 ), extra, c, s, dummy )
551 irow =
max( 1, jch-jku )
555 CALL
dlarot( .false., iltemp, .true., il, c, -s,
556 $ a( irow-iskew*ic+ioffst, ic ),
557 $ ilda, temp, extra )
559 CALL
dlartg( a( irow+1-iskew*( ic+1 )+ioffst,
560 $ ic+1 ), temp, c, s, dummy )
561 icol =
max( 1, jch-jku-jkl )
564 CALL
dlarot( .true., jch.GT.jku+jkl, .true.,
565 $ il, c, -s, a( irow-iskew*icol+
566 $ ioffst, icol ), ilda, extra,
580 DO 70 jc = 1,
min( n+jkl, m ) + jku - 1
582 angle = twopi*
dlarnd( 1, iseed )
585 irow =
max( 1, jc-jku )
587 il =
min( m, jc+jkl ) + 1 - irow
588 CALL
dlarot( .false., jc.GT.jku, .false., il, c,
589 $ s, a( irow-iskew*jc+ioffst, jc ),
590 $ ilda, extra, dummy )
597 DO 60 jch = jc - jku, 1, -jkl - jku
599 CALL
dlartg( a( ir+1-iskew*( ic+1 )+ioffst,
600 $ ic+1 ), extra, c, s, dummy )
602 icol =
max( 1, jch-jkl )
606 CALL
dlarot( .true., iltemp, .true., il, c, -s,
607 $ a( ir-iskew*icol+ioffst, icol ),
608 $ ilda, temp, extra )
610 CALL
dlartg( a( ir+1-iskew*( icol+1 )+ioffst,
611 $ icol+1 ), temp, c, s, dummy )
612 irow =
max( 1, jch-jkl-jku )
615 CALL
dlarot( .false., jch.GT.jkl+jku, .true.,
616 $ il, c, -s, a( irow-iskew*icol+
617 $ ioffst, icol ), ilda, extra,
638 iendch =
min( m, n+jkl ) - 1
639 DO 100 jc =
min( m+jku, n ) - 1, 1 - jkl, -1
641 angle = twopi*
dlarnd( 1, iseed )
644 irow =
max( 1, jc-jku+1 )
646 il =
min( m, jc+jkl+1 ) + 1 - irow
647 CALL
dlarot( .false., .false., jc+jkl.LT.m, il,
648 $ c, s, a( irow-iskew*jc+ioffst,
649 $ jc ), ilda, dummy, extra )
655 DO 90 jch = jc + jkl, iendch, jkl + jku
658 CALL
dlartg( a( jch-iskew*ic+ioffst, ic ),
659 $ extra, c, s, dummy )
662 icol =
min( n-1, jch+jku )
663 iltemp = jch + jku.LT.n
665 CALL
dlarot( .true., ilextr, iltemp, icol+2-ic,
666 $ c, s, a( jch-iskew*ic+ioffst, ic ),
667 $ ilda, extra, temp )
669 CALL
dlartg( a( jch-iskew*icol+ioffst,
670 $ icol ), temp, c, s, dummy )
671 il =
min( iendch, jch+jkl+jku ) + 2 - jch
673 CALL
dlarot( .false., .true.,
674 $ jch+jkl+jku.LE.iendch, il, c, s,
675 $ a( jch-iskew*icol+ioffst,
676 $ icol ), ilda, temp, extra )
691 iendch =
min( n, m+jku ) - 1
692 DO 130 jr =
min( n+jkl, m ) - 1, 1 - jku, -1
694 angle = twopi*
dlarnd( 1, iseed )
697 icol =
max( 1, jr-jkl+1 )
699 il =
min( n, jr+jku+1 ) + 1 - icol
700 CALL
dlarot( .true., .false., jr+jku.LT.n, il,
701 $ c, s, a( jr-iskew*icol+ioffst,
702 $ icol ), ilda, dummy, extra )
708 DO 120 jch = jr + jku, iendch, jkl + jku
711 CALL
dlartg( a( ir-iskew*jch+ioffst, jch ),
712 $ extra, c, s, dummy )
715 irow =
min( m-1, jch+jkl )
716 iltemp = jch + jkl.LT.m
718 CALL
dlarot( .false., ilextr, iltemp, irow+2-ir,
719 $ c, s, a( ir-iskew*jch+ioffst,
720 $ jch ), ilda, extra, temp )
722 CALL
dlartg( a( irow-iskew*jch+ioffst, jch ),
723 $ temp, c, s, dummy )
724 il =
min( iendch, jch+jkl+jku ) + 2 - jch
726 CALL
dlarot( .true., .true.,
727 $ jch+jkl+jku.LE.iendch, il, c, s,
728 $ a( irow-iskew*jch+ioffst, jch ),
729 $ ilda, temp, extra )
748 IF( ipack.GE.5 )
THEN
754 CALL dcopy( mnmin, d, 1, a( 1-iskew+ioffg, 1 ), ilda+1 )
758 irow =
max( 1, jc-k )
759 il =
min( jc+1, k+2 )
761 temp = a( jc-iskew*( jc+1 )+ioffg, jc+1 )
762 angle = twopi*
dlarnd( 1, iseed )
765 CALL
dlarot( .false., jc.GT.k, .true., il, c, s,
766 $ a( irow-iskew*jc+ioffg, jc ), ilda,
768 CALL
dlarot( .true., .true., .false.,
769 $
min( k, n-jc )+1, c, s,
770 $ a( ( 1-iskew )*jc+ioffg, jc ), ilda,
776 DO 150 jch = jc - k, 1, -k
777 CALL
dlartg( a( jch+1-iskew*( icol+1 )+ioffg,
778 $ icol+1 ), extra, c, s, dummy )
779 temp = a( jch-iskew*( jch+1 )+ioffg, jch+1 )
780 CALL
dlarot( .true., .true., .true., k+2, c, -s,
781 $ a( ( 1-iskew )*jch+ioffg, jch ),
782 $ ilda, temp, extra )
783 irow =
max( 1, jch-k )
784 il =
min( jch+1, k+2 )
786 CALL
dlarot( .false., jch.GT.k, .true., il, c,
787 $ -s, a( irow-iskew*jch+ioffg, jch ),
788 $ ilda, extra, temp )
797 IF( ipack.NE.ipackg .AND. ipack.NE.3 )
THEN
799 irow = ioffst - iskew*jc
800 DO 180 jr = jc,
min( n, jc+uub )
801 a( jr+irow, jc ) = a( jc-iskew*jr+ioffg, jr )
804 IF( ipack.EQ.5 )
THEN
805 DO 210 jc = n - uub + 1, n
806 DO 200 jr = n + 2 - jc, uub + 1
811 IF( ipackg.EQ.6 )
THEN
821 IF( ipack.GE.5 )
THEN
828 CALL dcopy( mnmin, d, 1, a( 1-iskew+ioffg, 1 ), ilda+1 )
831 DO 230 jc = n - 1, 1, -1
832 il =
min( n+1-jc, k+2 )
834 temp = a( 1+( 1-iskew )*jc+ioffg, jc )
835 angle = twopi*
dlarnd( 1, iseed )
838 CALL
dlarot( .false., .true., n-jc.GT.k, il, c, s,
839 $ a( ( 1-iskew )*jc+ioffg, jc ), ilda,
841 icol =
max( 1, jc-k+1 )
842 CALL
dlarot( .true., .false., .true., jc+2-icol, c,
843 $ s, a( jc-iskew*icol+ioffg, icol ),
844 $ ilda, dummy, temp )
849 DO 220 jch = jc + k, n - 1, k
850 CALL
dlartg( a( jch-iskew*icol+ioffg, icol ),
851 $ extra, c, s, dummy )
852 temp = a( 1+( 1-iskew )*jch+ioffg, jch )
853 CALL
dlarot( .true., .true., .true., k+2, c, s,
854 $ a( jch-iskew*icol+ioffg, icol ),
855 $ ilda, extra, temp )
856 il =
min( n+1-jch, k+2 )
858 CALL
dlarot( .false., .true., n-jch.GT.k, il, c,
859 $ s, a( ( 1-iskew )*jch+ioffg, jch ),
860 $ ilda, temp, extra )
869 IF( ipack.NE.ipackg .AND. ipack.NE.4 )
THEN
871 irow = ioffst - iskew*jc
872 DO 250 jr = jc,
max( 1, jc-uub ), -1
873 a( jr+irow, jc ) = a( jc-iskew*jr+ioffg, jr )
876 IF( ipack.EQ.6 )
THEN
878 DO 270 jr = 1, uub + 1 - jc
883 IF( ipackg.EQ.5 )
THEN
905 CALL
dlagge( mr, nc, llb, uub, d, a, lda, iseed, work,
911 CALL
dlagsy( m, llb, d, a, lda, iseed, work, iinfo )
914 IF( iinfo.NE.0 )
THEN
922 IF( ipack.NE.ipackg )
THEN
923 IF( ipack.EQ.1 )
THEN
933 ELSE IF( ipack.EQ.2 )
THEN
943 ELSE IF( ipack.EQ.3 )
THEN
952 IF( irow.GT.lda )
THEN
956 a( irow, icol ) = a( i, j )
960 ELSE IF( ipack.EQ.4 )
THEN
969 IF( irow.GT.lda )
THEN
973 a( irow, icol ) = a( i, j )
977 ELSE IF( ipack.GE.5 )
THEN
989 DO 370 i =
min( j+llb, m ), 1, -1
990 a( i-j+uub+1, j ) = a( i, j )
994 DO 400 j = uub + 2, n
995 DO 390 i = j - uub,
min( j+llb, m )
996 a( i-j+uub+1, j ) = a( i, j )
1006 IF( ipack.EQ.3 .OR. ipack.EQ.4 )
THEN
1008 DO 410 jr = irow + 1, lda
1014 ELSE IF( ipack.GE.5 )
THEN
1025 DO 430 jr = 1, uub + 1 - jc
1028 DO 440 jr =
max( 1,
min( ir1, ir2-jc ) ), lda