363 SUBROUTINE sdrvbd( 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,
380 INTEGER ISEED( 4 ), IWORK( * ), MM( * ), NN( * )
381 REAL A( LDA, * ), ASAV( LDA, * ), E( * ), S( * ),
382 $ ssav( * ), u( ldu, * ), usav( ldu, * ),
383 $ vt( ldvt, * ), vtsav( ldvt, * ), work( * )
389 REAL ZERO, ONE, TWO, HALF
390 PARAMETER ( ZERO = 0.0e0, one = 1.0e0, two = 2.0e0,
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 REAL ANORM, DIF, DIV, OVFL, RTUNFL, ULP,
404 $ ULPINV, UNFL, VL, VU
407 INTEGER LIWORK, LRWORK, NUMRANK
413 CHARACTER CJOB( 4 ), CJOBR( 3 ), CJOBV( 2 )
414 INTEGER IOLDSD( 4 ), ISEED2( 4 )
419 EXTERNAL SLAMCH, SLARND
427 INTRINSIC abs, real, 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(
'SDRVBD', -info )
494 path( 1: 1 ) =
'Single precision'
498 unfl = slamch(
'Safe minimum' )
501 ulp = slamch(
'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 slaset(
'Full', m, n, zero, zero, a, lda )
538 ELSE IF( jtype.EQ.2 )
THEN
542 CALL slaset(
'Full', m, n, zero, one, a, lda )
554 CALL slatms( m, n,
'U', iseed,
'N', s, 4, real( 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 slacpy(
'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 slacpy(
'F', m, n, asav, lda, a, lda )
587 CALL sgesvd(
'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 sbdt01( 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 sort01(
'Columns', m, m, usav, ldu, work, lwork,
603 CALL sort01(
'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 slacpy(
'F', m, n, asav, lda, a, lda )
631 CALL sgesvd( 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 sort03(
'C', m, mnmin, m, mnmin, usav,
640 $ ldu, a, lda, work, lwork, dif,
642 ELSE IF( iju.EQ.2 )
THEN
643 CALL sort03(
'C', m, mnmin, m, mnmin, usav,
644 $ ldu, u, ldu, work, lwork, dif,
646 ELSE IF( iju.EQ.3 )
THEN
647 CALL sort03(
'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 sort03(
'R', n, mnmin, n, mnmin, vtsav,
660 $ ldvt, a, lda, work, lwork, dif,
662 ELSE IF( ijvt.EQ.2 )
THEN
663 CALL sort03(
'R', n, mnmin, n, mnmin, vtsav,
664 $ ldvt, vt, ldvt, work, lwork,
666 ELSE IF( ijvt.EQ.3 )
THEN
667 CALL sort03(
'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 slacpy(
'F', m, n, asav, lda, a, lda )
700 CALL sgesdd(
'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 sbdt01( 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 sort01(
'Columns', m, m, usav, ldu, work, lwork,
716 CALL sort01(
'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 slacpy(
'F', m, n, asav, lda, a, lda )
740 CALL sgesdd( 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 sort03(
'C', m, mnmin, m, mnmin, usav,
750 $ ldu, a, lda, work, lwork, dif,
753 CALL sort03(
'C', m, mnmin, m, mnmin, usav,
754 $ ldu, u, ldu, work, lwork, dif,
757 ELSE IF( ijq.EQ.2 )
THEN
758 CALL sort03(
'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 sort03(
'R', n, mnmin, n, mnmin, vtsav,
771 $ ldvt, vt, ldvt, work, lwork,
774 CALL sort03(
'R', n, mnmin, n, mnmin, vtsav,
775 $ ldvt, a, lda, work, lwork, dif,
778 ELSE IF( ijq.EQ.2 )
THEN
779 CALL sort03(
'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 slacpy(
'F', m, n, asav, lda, a, lda )
821 CALL sgesvdq(
'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 )
'SGESVDQ', iinfo, m, n,
828 $ jtype, lswork, ioldsd
835 CALL sbdt01( 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 sort01(
'Columns', m, m, usav, ldu, work,
839 $ lwork, result( 37 ) )
840 CALL sort01(
'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 slacpy(
'F', m, n, asav, lda, usav, lda )
874 CALL sgesvj(
'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 sbdt01( 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 sort01(
'Columns', m, m, usav, ldu, work,
898 $ lwork, result( 16 ) )
899 CALL sort01(
'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 slacpy(
'F', m, n, asav, lda, vtsav, lda )
932 CALL sgejsv(
'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 sbdt01( 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 sort01(
'Columns', m, m, usav, ldu, work,
957 $ lwork, result( 20 ) )
958 CALL sort01(
'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 slacpy(
'F', m, n, asav, lda, a, lda )
977 CALL sgesvdx(
'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 sbdt01( 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 sort01(
'Columns', m, m, usav, ldu, work, lwork,
998 CALL sort01(
'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 slacpy(
'F', m, n, asav, lda, a, lda )
1026 CALL sgesvdx( 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 sort03(
'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 sort03(
'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 )*slarnd( 1, iseed2 ) )
1080 iu = 1 + int( ( mnmin-1 )*slarnd( 1, iseed2 ) )
1087 CALL slacpy(
'F', m, n, asav, lda, a, lda )
1088 CALL sgesvdx(
'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 sbdt05( m, n, asav, lda, s, nsi, u, ldu,
1103 $ vt, ldvt, work, result( 30 ) )
1104 CALL sort01(
'Columns', m, nsi, u, ldu, work, lwork,
1106 CALL sort01(
'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 slacpy(
'F', m, n, asav, lda, a, lda )
1136 CALL sgesvdx(
'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 sbdt05( m, n, asav, lda, s, nsv, u, ldu,
1151 $ vt, ldvt, work, result( 33 ) )
1152 CALL sort01(
'Columns', m, nsv, u, ldu, work, lwork,
1154 CALL sort01(
'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 SDRVBD 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 $
' SGESVDX(V,V,A) ',
1215 $ /
'23 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ),'
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 $
' SGESVDX(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 $
' SGESVDX(V,V,V) ',
1229 $ /
'34 = | I - U**T U | / ( M ulp ) ',
1230 $ /
'35 = | I - VT VT**T | / ( N ulp ) ',
1231 $
' SGESVDQ(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(
' SDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1241 $ i6,
', N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
1243 9995
FORMAT(
' SDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1244 $ i6,
', N=', i6,
', JTYPE=', i6,
', LSWORK=', i6, / 9x,
1245 $
'ISEED=(', 3( i5,
',' ), i5,
')' )
subroutine slabad(SMALL, LARGE)
SLABAD
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 slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine sbdt05(M, N, A, LDA, S, NS, U, LDU, VT, LDVT, WORK, RESID)
SBDT05
subroutine slatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
SLATMS
subroutine sgesvj(JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V, LDV, WORK, LWORK, INFO)
SGESVJ
subroutine sgejsv(JOBA, JOBU, JOBV, JOBR, JOBT, JOBP, M, N, A, LDA, SVA, U, LDU, V, LDV, WORK, LWORK, IWORK, INFO)
SGEJSV
subroutine sgesvdq(JOBA, JOBP, JOBR, JOBU, JOBV, M, N, A, LDA, S, U, LDU, V, LDV, NUMRANK, IWORK, LIWORK, WORK, LWORK, RWORK, LRWORK, INFO)
SGESVDQ computes the singular value decomposition (SVD) with a QR-Preconditioned QR SVD Method for GE...
subroutine sgesdd(JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO)
SGESDD
subroutine sgesvdx(JOBU, JOBVT, RANGE, M, N, A, LDA, VL, VU, IL, IU, NS, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO)
SGESVDX computes the singular value decomposition (SVD) for GE matrices
subroutine sgesvd(JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, INFO)
SGESVD computes the singular value decomposition (SVD) for GE matrices
subroutine sort01(ROWCOL, M, N, U, LDU, WORK, LWORK, RESID)
SORT01
subroutine sdrvbd(NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH, A, LDA, U, LDU, VT, LDVT, ASAV, USAV, VTSAV, S, SSAV, E, WORK, LWORK, IWORK, NOUT, INFO)
SDRVBD
subroutine sbdt01(M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK, RESID)
SBDT01
subroutine sort03(RC, MU, MV, N, K, U, LDU, V, LDV, WORK, LWORK, RESULT, INFO)
SORT03