363 SUBROUTINE ddrvbd( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
364 $ A, LDA, U, LDU, VT, LDVT, ASAV, USAV, VTSAV, S,
365 $ SSAV, E, WORK, LWORK, IWORK, NOUT, INFO )
374 INTEGER INFO, LDA, LDU, LDVT, LWORK, NOUT, NSIZES,
376 DOUBLE PRECISION THRESH
380 INTEGER ISEED( 4 ), IWORK( * ), MM( * ), NN( * )
381 DOUBLE PRECISION A( LDA, * ), ASAV( LDA, * ), E( * ), S( * ),
382 $ ssav( * ), u( ldu, * ), usav( ldu, * ),
383 $ vt( ldvt, * ), vtsav( ldvt, * ), work( * )
389 DOUBLE PRECISION ZERO, ONE, TWO, HALF
390 PARAMETER ( ZERO = 0.0d0, one = 1.0d0, two = 2.0d0,
393 PARAMETER ( MAXTYP = 5 )
397 CHARACTER JOBQ, JOBU, JOBVT, RANGE
399 INTEGER I, IINFO, IJQ, IJU, IJVT, IL,IU, IWS, IWTMP,
400 $ itemp, j, jsize, jtype, lswork, m, minwrk,
401 $ mmax, mnmax, mnmin, mtypes, n, nfail,
402 $ nmax, ns, nsi, nsv, ntest
403 DOUBLE PRECISION ANORM, DIF, DIV, OVFL, RTUNFL, ULP,
404 $ ULPINV, UNFL, VL, VU
407 INTEGER LIWORK, LRWORK, NUMRANK
410 DOUBLE PRECISION RWORK( 2 )
413 CHARACTER CJOB( 4 ), CJOBR( 3 ), CJOBV( 2 )
414 INTEGER IOLDSD( 4 ), ISEED2( 4 )
415 DOUBLE PRECISION RESULT( 39 )
418 DOUBLE PRECISION DLAMCH, DLARND
419 EXTERNAL DLAMCH, DLARND
427 INTRINSIC abs, dble, int, max, min
435 COMMON / infoc / infot, nunit, ok, lerr
436 COMMON / srnamc / srnamt
439 DATA cjob /
'N',
'O',
'S',
'A' /
440 DATA cjobr /
'A',
'V',
'I' /
441 DATA cjobv /
'N',
'V' /
455 mmax = max( mmax, mm( j ) )
458 nmax = max( nmax, nn( j ) )
461 mnmax = max( mnmax, min( mm( j ), nn( j ) ) )
462 minwrk = max( minwrk, max( 3*min( mm( j ),
463 $ nn( j ) )+max( mm( j ), nn( j ) ), 5*min( mm( j ),
464 $ nn( j )-4 ) )+2*min( mm( j ), nn( j ) )**2 )
469 IF( nsizes.LT.0 )
THEN
471 ELSE IF( badmm )
THEN
473 ELSE IF( badnn )
THEN
475 ELSE IF( ntypes.LT.0 )
THEN
477 ELSE IF( lda.LT.max( 1, mmax ) )
THEN
479 ELSE IF( ldu.LT.max( 1, mmax ) )
THEN
481 ELSE IF( ldvt.LT.max( 1, nmax ) )
THEN
483 ELSE IF( minwrk.GT.lwork )
THEN
488 CALL xerbla(
'DDRVBD', -info )
494 path( 1: 1 ) =
'Double precision'
498 unfl = dlamch(
'Safe minimum' )
501 ulp = dlamch(
'Precision' )
502 rtunfl = sqrt( unfl )
508 DO 240 jsize = 1, nsizes
513 IF( nsizes.NE.1 )
THEN
514 mtypes = min( maxtyp, ntypes )
516 mtypes = min( maxtyp+1, ntypes )
519 DO 230 jtype = 1, mtypes
520 IF( .NOT.dotype( jtype ) )
524 ioldsd( j ) = iseed( j )
529 IF( mtypes.GT.maxtyp )
532 IF( jtype.EQ.1 )
THEN
536 CALL dlaset(
'Full', m, n, zero, zero, a, lda )
538 ELSE IF( jtype.EQ.2 )
THEN
542 CALL dlaset(
'Full', m, n, zero, one, a, lda )
554 CALL dlatms( m, n,
'U', iseed,
'N', s, 4, dble( mnmin ),
555 $ anorm, m-1, n-1,
'N', a, lda, work, iinfo )
556 IF( iinfo.NE.0 )
THEN
557 WRITE( nout, fmt = 9996 )
'Generator', iinfo, m, n,
565 CALL dlacpy(
'F', m, n, a, lda, asav, lda )
577 iwtmp = max( 3*min( m, n )+max( m, n ), 5*min( m, n ) )
578 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
579 lswork = min( lswork, lwork )
580 lswork = max( lswork, 1 )
585 $
CALL dlacpy(
'F', m, n, asav, lda, a, lda )
587 CALL dgesvd(
'A',
'A', m, n, a, lda, ssav, usav, ldu,
588 $ vtsav, ldvt, work, lswork, iinfo )
589 IF( iinfo.NE.0 )
THEN
590 WRITE( nout, fmt = 9995 )
'GESVD', iinfo, m, n, jtype,
598 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
599 $ vtsav, ldvt, work, result( 1 ) )
600 IF( m.NE.0 .AND. n.NE.0 )
THEN
601 CALL dort01(
'Columns', m, m, usav, ldu, work, lwork,
603 CALL dort01(
'Rows', n, n, vtsav, ldvt, work, lwork,
607 DO 50 i = 1, mnmin - 1
608 IF( ssav( i ).LT.ssav( i+1 ) )
609 $ result( 4 ) = ulpinv
610 IF( ssav( i ).LT.zero )
611 $ result( 4 ) = ulpinv
613 IF( mnmin.GE.1 )
THEN
614 IF( ssav( mnmin ).LT.zero )
615 $ result( 4 ) = ulpinv
625 IF( ( iju.EQ.3 .AND. ijvt.EQ.3 ) .OR.
626 $ ( iju.EQ.1 .AND. ijvt.EQ.1 ) )
GO TO 70
628 jobvt = cjob( ijvt+1 )
629 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
631 CALL dgesvd( jobu, jobvt, m, n, a, lda, s, u, ldu,
632 $ vt, ldvt, work, lswork, iinfo )
637 IF( m.GT.0 .AND. n.GT.0 )
THEN
639 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
640 $ ldu, a, lda, work, lwork, dif,
642 ELSE IF( iju.EQ.2 )
THEN
643 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
644 $ ldu, u, ldu, work, lwork, dif,
646 ELSE IF( iju.EQ.3 )
THEN
647 CALL dort03(
'C', m, m, m, mnmin, usav, ldu,
648 $ u, ldu, work, lwork, dif,
652 result( 5 ) = max( result( 5 ), dif )
657 IF( m.GT.0 .AND. n.GT.0 )
THEN
659 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
660 $ ldvt, a, lda, work, lwork, dif,
662 ELSE IF( ijvt.EQ.2 )
THEN
663 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
664 $ ldvt, vt, ldvt, work, lwork,
666 ELSE IF( ijvt.EQ.3 )
THEN
667 CALL dort03(
'R', n, n, n, mnmin, vtsav,
668 $ ldvt, vt, ldvt, work, lwork,
672 result( 6 ) = max( result( 6 ), dif )
677 div = max( mnmin*ulp*s( 1 ), unfl )
678 DO 60 i = 1, mnmin - 1
679 IF( ssav( i ).LT.ssav( i+1 ) )
681 IF( ssav( i ).LT.zero )
683 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
685 result( 7 ) = max( result( 7 ), dif )
691 iwtmp = 5*mnmin*mnmin + 9*mnmin + max( m, n )
692 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
693 lswork = min( lswork, lwork )
694 lswork = max( lswork, 1 )
698 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
700 CALL dgesdd(
'A', m, n, a, lda, ssav, usav, ldu, vtsav,
701 $ ldvt, work, lswork, iwork, iinfo )
702 IF( iinfo.NE.0 )
THEN
703 WRITE( nout, fmt = 9995 )
'GESDD', iinfo, m, n, jtype,
711 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
712 $ vtsav, ldvt, work, result( 8 ) )
713 IF( m.NE.0 .AND. n.NE.0 )
THEN
714 CALL dort01(
'Columns', m, m, usav, ldu, work, lwork,
716 CALL dort01(
'Rows', n, n, vtsav, ldvt, work, lwork,
720 DO 90 i = 1, mnmin - 1
721 IF( ssav( i ).LT.ssav( i+1 ) )
722 $ result( 11 ) = ulpinv
723 IF( ssav( i ).LT.zero )
724 $ result( 11 ) = ulpinv
726 IF( mnmin.GE.1 )
THEN
727 IF( ssav( mnmin ).LT.zero )
728 $ result( 11 ) = ulpinv
738 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
740 CALL dgesdd( jobq, m, n, a, lda, s, u, ldu, vt, ldvt,
741 $ work, lswork, iwork, iinfo )
746 IF( m.GT.0 .AND. n.GT.0 )
THEN
749 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
750 $ ldu, a, lda, work, lwork, dif,
753 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
754 $ ldu, u, ldu, work, lwork, dif,
757 ELSE IF( ijq.EQ.2 )
THEN
758 CALL dort03(
'C', m, mnmin, m, mnmin, usav, ldu,
759 $ u, ldu, work, lwork, dif, info )
762 result( 12 ) = max( result( 12 ), dif )
767 IF( m.GT.0 .AND. n.GT.0 )
THEN
770 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
771 $ ldvt, vt, ldvt, work, lwork,
774 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
775 $ ldvt, a, lda, work, lwork, dif,
778 ELSE IF( ijq.EQ.2 )
THEN
779 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
780 $ ldvt, vt, ldvt, work, lwork, dif,
784 result( 13 ) = max( result( 13 ), dif )
789 div = max( mnmin*ulp*s( 1 ), unfl )
790 DO 100 i = 1, mnmin - 1
791 IF( ssav( i ).LT.ssav( i+1 ) )
793 IF( ssav( i ).LT.zero )
795 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
797 result( 14 ) = max( result( 14 ), dif )
809 iwtmp = 5*mnmin*mnmin + 9*mnmin + max( m, n )
810 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
811 lswork = min( lswork, lwork )
812 lswork = max( lswork, 1 )
816 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
821 CALL dgesvdq(
'H',
'N',
'N',
'A',
'A',
822 $ m, n, a, lda, ssav, usav, ldu,
823 $ vtsav, ldvt, numrank, iwork, liwork,
824 $ work, lwork, rwork, lrwork, iinfo )
826 IF( iinfo.NE.0 )
THEN
827 WRITE( nout, fmt = 9995 )
'DGESVDQ', iinfo, m, n,
828 $ jtype, lswork, ioldsd
835 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
836 $ vtsav, ldvt, work, result( 36 ) )
837 IF( m.NE.0 .AND. n.NE.0 )
THEN
838 CALL dort01(
'Columns', m, m, usav, ldu, work,
839 $ lwork, result( 37 ) )
840 CALL dort01(
'Rows', n, n, vtsav, ldvt, work,
841 $ lwork, result( 38 ) )
844 DO 199 i = 1, mnmin - 1
845 IF( ssav( i ).LT.ssav( i+1 ) )
846 $ result( 39 ) = ulpinv
847 IF( ssav( i ).LT.zero )
848 $ result( 39 ) = ulpinv
850 IF( mnmin.GE.1 )
THEN
851 IF( ssav( mnmin ).LT.zero )
852 $ result( 39 ) = ulpinv
865 iwtmp = 5*mnmin*mnmin + 9*mnmin + max( m, n )
866 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
867 lswork = min( lswork, lwork )
868 lswork = max( lswork, 1 )
872 CALL dlacpy(
'F', m, n, asav, lda, usav, lda )
874 CALL dgesvj(
'G',
'U',
'V', m, n, usav, lda, ssav,
875 & 0, a, ldvt, work, lwork, info )
885 IF( iinfo.NE.0 )
THEN
886 WRITE( nout, fmt = 9995 )
'GESVJ', iinfo, m, n,
887 $ jtype, lswork, ioldsd
894 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
895 $ vtsav, ldvt, work, result( 15 ) )
896 IF( m.NE.0 .AND. n.NE.0 )
THEN
897 CALL dort01(
'Columns', m, m, usav, ldu, work,
898 $ lwork, result( 16 ) )
899 CALL dort01(
'Rows', n, n, vtsav, ldvt, work,
900 $ lwork, result( 17 ) )
903 DO 120 i = 1, mnmin - 1
904 IF( ssav( i ).LT.ssav( i+1 ) )
905 $ result( 18 ) = ulpinv
906 IF( ssav( i ).LT.zero )
907 $ result( 18 ) = ulpinv
909 IF( mnmin.GE.1 )
THEN
910 IF( ssav( mnmin ).LT.zero )
911 $ result( 18 ) = ulpinv
923 iwtmp = 5*mnmin*mnmin + 9*mnmin + max( m, n )
924 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
925 lswork = min( lswork, lwork )
926 lswork = max( lswork, 1 )
930 CALL dlacpy(
'F', m, n, asav, lda, vtsav, lda )
932 CALL dgejsv(
'G',
'U',
'V',
'R',
'N',
'N',
933 & m, n, vtsav, lda, ssav, usav, ldu, a, ldvt,
934 & work, lwork, iwork, info )
944 IF( iinfo.NE.0 )
THEN
945 WRITE( nout, fmt = 9995 )
'GEJSV', iinfo, m, n,
946 $ jtype, lswork, ioldsd
953 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
954 $ vtsav, ldvt, work, result( 19 ) )
955 IF( m.NE.0 .AND. n.NE.0 )
THEN
956 CALL dort01(
'Columns', m, m, usav, ldu, work,
957 $ lwork, result( 20 ) )
958 CALL dort01(
'Rows', n, n, vtsav, ldvt, work,
959 $ lwork, result( 21 ) )
962 DO 150 i = 1, mnmin - 1
963 IF( ssav( i ).LT.ssav( i+1 ) )
964 $ result( 22 ) = ulpinv
965 IF( ssav( i ).LT.zero )
966 $ result( 22 ) = ulpinv
968 IF( mnmin.GE.1 )
THEN
969 IF( ssav( mnmin ).LT.zero )
970 $ result( 22 ) = ulpinv
976 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
977 CALL dgesvdx(
'V',
'V',
'A', m, n, a, lda,
978 $ vl, vu, il, iu, ns, ssav, usav, ldu,
979 $ vtsav, ldvt, work, lwork, iwork,
981 IF( iinfo.NE.0 )
THEN
982 WRITE( nout, fmt = 9995 )
'GESVDX', iinfo, m, n,
983 $ jtype, lswork, ioldsd
993 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
994 $ vtsav, ldvt, work, result( 23 ) )
995 IF( m.NE.0 .AND. n.NE.0 )
THEN
996 CALL dort01(
'Columns', m, m, usav, ldu, work, lwork,
998 CALL dort01(
'Rows', n, n, vtsav, ldvt, work, lwork,
1002 DO 160 i = 1, mnmin - 1
1003 IF( ssav( i ).LT.ssav( i+1 ) )
1004 $ result( 26 ) = ulpinv
1005 IF( ssav( i ).LT.zero )
1006 $ result( 26 ) = ulpinv
1008 IF( mnmin.GE.1 )
THEN
1009 IF( ssav( mnmin ).LT.zero )
1010 $ result( 26 ) = ulpinv
1020 IF( ( iju.EQ.0 .AND. ijvt.EQ.0 ) .OR.
1021 $ ( iju.EQ.1 .AND. ijvt.EQ.1 ) )
GO TO 170
1022 jobu = cjobv( iju+1 )
1023 jobvt = cjobv( ijvt+1 )
1025 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
1026 CALL dgesvdx( jobu, jobvt, range, m, n, a, lda,
1027 $ vl, vu, il, iu, ns, s, u, ldu,
1028 $ vt, ldvt, work, lwork, iwork,
1034 IF( m.GT.0 .AND. n.GT.0 )
THEN
1036 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
1037 $ ldu, u, ldu, work, lwork, dif,
1041 result( 27 ) = max( result( 27 ), dif )
1046 IF( m.GT.0 .AND. n.GT.0 )
THEN
1047 IF( ijvt.EQ.1 )
THEN
1048 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
1049 $ ldvt, vt, ldvt, work, lwork,
1053 result( 28 ) = max( result( 28 ), dif )
1058 div = max( mnmin*ulp*s( 1 ), unfl )
1059 DO 190 i = 1, mnmin - 1
1060 IF( ssav( i ).LT.ssav( i+1 ) )
1062 IF( ssav( i ).LT.zero )
1064 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
1066 result( 29 ) = max( result( 29 ), dif )
1073 iseed2( i ) = iseed( i )
1075 IF( mnmin.LE.1 )
THEN
1077 iu = max( 1, mnmin )
1079 il = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1080 iu = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1087 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
1088 CALL dgesvdx(
'V',
'V',
'I', m, n, a, lda,
1089 $ vl, vu, il, iu, nsi, s, u, ldu,
1090 $ vt, ldvt, work, lwork, iwork,
1092 IF( iinfo.NE.0 )
THEN
1093 WRITE( nout, fmt = 9995 )
'GESVDX', iinfo, m, n,
1094 $ jtype, lswork, ioldsd
1102 CALL dbdt05( m, n, asav, lda, s, nsi, u, ldu,
1103 $ vt, ldvt, work, result( 30 ) )
1104 CALL dort01(
'Columns', m, nsi, u, ldu, work, lwork,
1106 CALL dort01(
'Rows', nsi, n, vt, ldvt, work, lwork,
1111 IF( mnmin.GT.0 .AND. nsi.GT.1 )
THEN
1114 $ max( half*abs( ssav( il )-ssav( il-1 ) ),
1115 $ ulp*anorm, two*rtunfl )
1118 $ max( half*abs( ssav( ns )-ssav( 1 ) ),
1119 $ ulp*anorm, two*rtunfl )
1122 vl = ssav( iu ) - max( ulp*anorm, two*rtunfl,
1123 $ half*abs( ssav( iu+1 )-ssav( iu ) ) )
1125 vl = ssav( ns ) - max( ulp*anorm, two*rtunfl,
1126 $ half*abs( ssav( ns )-ssav( 1 ) ) )
1130 IF( vl.GE.vu ) vu = max( vu*2, vu+vl+half )
1135 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
1136 CALL dgesvdx(
'V',
'V',
'V', m, n, a, lda,
1137 $ vl, vu, il, iu, nsv, s, u, ldu,
1138 $ vt, ldvt, work, lwork, iwork,
1140 IF( iinfo.NE.0 )
THEN
1141 WRITE( nout, fmt = 9995 )
'GESVDX', iinfo, m, n,
1142 $ jtype, lswork, ioldsd
1150 CALL dbdt05( m, n, asav, lda, s, nsv, u, ldu,
1151 $ vt, ldvt, work, result( 33 ) )
1152 CALL dort01(
'Columns', m, nsv, u, ldu, work, lwork,
1154 CALL dort01(
'Rows', nsv, n, vt, ldvt, work, lwork,
1160 IF( result( j ).GE.thresh )
THEN
1161 IF( nfail.EQ.0 )
THEN
1162 WRITE( nout, fmt = 9999 )
1163 WRITE( nout, fmt = 9998 )
1165 WRITE( nout, fmt = 9997 )m, n, jtype, iws, ioldsd,
1177 CALL alasvm( path, nout, nfail, ntest, 0 )
1179 9999
FORMAT(
' SVD -- Real Singular Value Decomposition Driver ',
1180 $ /
' Matrix types (see DDRVBD for details):',
1181 $ / /
' 1 = Zero matrix', /
' 2 = Identity matrix',
1182 $ /
' 3 = Evenly spaced singular values near 1',
1183 $ /
' 4 = Evenly spaced singular values near underflow',
1184 $ /
' 5 = Evenly spaced singular values near overflow', / /
1185 $
' Tests performed: ( A is dense, U and V are orthogonal,',
1186 $ / 19x,
' S is an array, and Upartial, VTpartial, and',
1187 $ / 19x,
' Spartial are partially computed U, VT and S),', / )
1188 9998
FORMAT(
' 1 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1189 $ /
' 2 = | I - U**T U | / ( M ulp ) ',
1190 $ /
' 3 = | I - VT VT**T | / ( N ulp ) ',
1191 $ /
' 4 = 0 if S contains min(M,N) nonnegative values in',
1192 $
' decreasing order, else 1/ulp',
1193 $ /
' 5 = | U - Upartial | / ( M ulp )',
1194 $ /
' 6 = | VT - VTpartial | / ( N ulp )',
1195 $ /
' 7 = | S - Spartial | / ( min(M,N) ulp |S| )',
1196 $ /
' 8 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1197 $ /
' 9 = | I - U**T U | / ( M ulp ) ',
1198 $ /
'10 = | I - VT VT**T | / ( N ulp ) ',
1199 $ /
'11 = 0 if S contains min(M,N) nonnegative values in',
1200 $
' decreasing order, else 1/ulp',
1201 $ /
'12 = | U - Upartial | / ( M ulp )',
1202 $ /
'13 = | VT - VTpartial | / ( N ulp )',
1203 $ /
'14 = | S - Spartial | / ( min(M,N) ulp |S| )',
1204 $ /
'15 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1205 $ /
'16 = | I - U**T U | / ( M ulp ) ',
1206 $ /
'17 = | I - VT VT**T | / ( N ulp ) ',
1207 $ /
'18 = 0 if S contains min(M,N) nonnegative values in',
1208 $
' decreasing order, else 1/ulp',
1209 $ /
'19 = | U - Upartial | / ( M ulp )',
1210 $ /
'20 = | VT - VTpartial | / ( N ulp )',
1211 $ /
'21 = | S - Spartial | / ( min(M,N) ulp |S| )',
1212 $ /
'22 = 0 if S contains min(M,N) nonnegative values in',
1213 $
' decreasing order, else 1/ulp',
1214 $ /
'23 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ),',
1215 $
' DGESVDX(V,V,A) ',
1216 $ /
'24 = | I - U**T U | / ( M ulp ) ',
1217 $ /
'25 = | I - VT VT**T | / ( N ulp ) ',
1218 $ /
'26 = 0 if S contains min(M,N) nonnegative values in',
1219 $
' decreasing order, else 1/ulp',
1220 $ /
'27 = | U - Upartial | / ( M ulp )',
1221 $ /
'28 = | VT - VTpartial | / ( N ulp )',
1222 $ /
'29 = | S - Spartial | / ( min(M,N) ulp |S| )',
1223 $ /
'30 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp ),',
1224 $
' DGESVDX(V,V,I) ',
1225 $ /
'31 = | I - U**T U | / ( M ulp ) ',
1226 $ /
'32 = | I - VT VT**T | / ( N ulp ) ',
1227 $ /
'33 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp ),',
1228 $
' DGESVDX(V,V,V) ',
1229 $ /
'34 = | I - U**T U | / ( M ulp ) ',
1230 $ /
'35 = | I - VT VT**T | / ( N ulp ) ',
1231 $
' DGESVDQ(H,N,N,A,A',
1232 $ /
'36 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1233 $ /
'37 = | I - U**T U | / ( M ulp ) ',
1234 $ /
'38 = | I - VT VT**T | / ( N ulp ) ',
1235 $ /
'39 = 0 if S contains min(M,N) nonnegative values in',
1236 $
' decreasing order, else 1/ulp',
1238 9997
FORMAT(
' M=', i5,
', N=', i5,
', type ', i1,
', IWS=', i1,
1239 $
', seed=', 4( i4,
',' ),
' test(', i2,
')=', g11.4 )
1240 9996
FORMAT(
' DDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1241 $ i6,
', N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
1243 9995
FORMAT(
' DDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1244 $ i6,
', N=', i6,
', JTYPE=', i6,
', LSWORK=', i6, / 9x,
1245 $
'ISEED=(', 3( i5,
',' ), i5,
')' )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine ddrvbd(NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH, A, LDA, U, LDU, VT, LDVT, ASAV, USAV, VTSAV, S, SSAV, E, WORK, LWORK, IWORK, NOUT, INFO)
DDRVBD
subroutine dbdt01(M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK, RESID)
DBDT01
subroutine dort01(ROWCOL, M, N, U, LDU, WORK, LWORK, RESID)
DORT01
subroutine dort03(RC, MU, MV, N, K, U, LDU, V, LDV, WORK, LWORK, RESULT, INFO)
DORT03
subroutine dbdt05(M, N, A, LDA, S, NS, U, LDU, VT, LDVT, WORK, RESID)
DBDT05
subroutine dlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
DLATMS
subroutine dgesvj(JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V, LDV, WORK, LWORK, INFO)
DGESVJ
subroutine dgesvdq(JOBA, JOBP, JOBR, JOBU, JOBV, M, N, A, LDA, S, U, LDU, V, LDV, NUMRANK, IWORK, LIWORK, WORK, LWORK, RWORK, LRWORK, INFO)
DGESVDQ computes the singular value decomposition (SVD) with a QR-Preconditioned QR SVD Method for GE...
subroutine dgesvd(JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, INFO)
DGESVD computes the singular value decomposition (SVD) for GE matrices
subroutine dgejsv(JOBA, JOBU, JOBV, JOBR, JOBT, JOBP, M, N, A, LDA, SVA, U, LDU, V, LDV, WORK, LWORK, IWORK, INFO)
DGEJSV
subroutine dgesvdx(JOBU, JOBVT, RANGE, M, N, A, LDA, VL, VU, IL, IU, NS, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO)
DGESVDX computes the singular value decomposition (SVD) for GE matrices
subroutine dgesdd(JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO)
DGESDD