489 SUBROUTINE schkbd( NSIZES, MVAL, NVAL, NTYPES, DOTYPE, NRHS,
490 $ ISEED, THRESH, A, LDA, BD, BE, S1, S2, X, LDX,
491 $ Y, Z, Q, LDQ, PT, LDPT, U, VT, WORK, LWORK,
492 $ IWORK, NOUT, INFO )
499 INTEGER INFO, LDA, LDPT, LDQ, LDX, LWORK, NOUT, NRHS,
505 INTEGER ISEED( 4 ), IWORK( * ), MVAL( * ), NVAL( * )
506 REAL A( LDA, * ), BD( * ), BE( * ), PT( LDPT, * ),
507 $ q( ldq, * ), s1( * ), s2( * ), u( ldpt, * ),
508 $ vt( ldpt, * ), work( * ), x( ldx, * ),
509 $ y( ldx, * ), z( ldx, * )
515 REAL ZERO, ONE, TWO, HALF
516 PARAMETER ( ZERO = 0.0e0, one = 1.0e0, two = 2.0e0,
519 parameter( maxtyp = 16 )
522 LOGICAL BADMM, BADNN, BIDIAG
525 INTEGER I, IINFO, IL, IMODE, ITEMP, ITYPE, IU, IWBD,
526 $ iwbe, iwbs, iwbz, iwwork, j, jcol, jsize,
527 $ jtype, log2ui, m, minwrk, mmax, mnmax, mnmin,
528 $ mnmin2, mq, mtypes, n, nfail, nmax,
530 REAL ABSTOL, AMNINV, ANORM, COND, OVFL, RTOVFL,
531 $ RTUNFL, TEMP1, TEMP2, ULP, ULPINV, UNFL,
535 INTEGER IDUM( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
536 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
538 REAL DUM( 1 ), DUMMA( 1 ), RESULT( 40 )
541 REAL SLAMCH, SLARND, SSXT1
542 EXTERNAL SLAMCH, SLARND, SSXT1
551 INTRINSIC abs, exp, int, log, max, min, sqrt
559 COMMON / infoc / infot, nunit, ok, lerr
560 COMMON / srnamc / srnamt
563 DATA ktype / 1, 2, 5*4, 5*6, 3*9, 10 /
564 DATA kmagn / 2*1, 3*1, 2, 3, 3*1, 2, 3, 1, 2, 3, 0 /
565 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
581 mmax = max( mmax, mval( j ) )
584 nmax = max( nmax, nval( j ) )
587 mnmax = max( mnmax, min( mval( j ), nval( j ) ) )
588 minwrk = max( minwrk, 3*( mval( j )+nval( j ) ),
589 $ mval( j )*( mval( j )+max( mval( j ), nval( j ),
590 $ nrhs )+1 )+nval( j )*min( nval( j ), mval( j ) ) )
595 IF( nsizes.LT.0 )
THEN
597 ELSE IF( badmm )
THEN
599 ELSE IF( badnn )
THEN
601 ELSE IF( ntypes.LT.0 )
THEN
603 ELSE IF( nrhs.LT.0 )
THEN
605 ELSE IF( lda.LT.mmax )
THEN
607 ELSE IF( ldx.LT.mmax )
THEN
609 ELSE IF( ldq.LT.mmax )
THEN
611 ELSE IF( ldpt.LT.mnmax )
THEN
613 ELSE IF( minwrk.GT.lwork )
THEN
618 CALL xerbla(
'SCHKBD', -info )
624 path( 1: 1 ) =
'Single precision'
628 unfl = slamch(
'Safe minimum' )
629 ovfl = slamch(
'Overflow' )
630 ulp = slamch(
'Precision' )
632 log2ui = int( log( ulpinv ) / log( two ) )
633 rtunfl = sqrt( unfl )
634 rtovfl = sqrt( ovfl )
640 DO 300 jsize = 1, nsizes
644 amninv = one / max( m, n, 1 )
646 IF( nsizes.NE.1 )
THEN
647 mtypes = min( maxtyp, ntypes )
649 mtypes = min( maxtyp+1, ntypes )
652 DO 290 jtype = 1, mtypes
653 IF( .NOT.dotype( jtype ) )
657 ioldsd( j ) = iseed( j )
682 IF( mtypes.GT.maxtyp )
685 itype = ktype( jtype )
686 imode = kmode( jtype )
690 GO TO ( 40, 50, 60 )kmagn( jtype )
697 anorm = ( rtovfl*ulp )*amninv
701 anorm = rtunfl*max( m, n )*ulpinv
706 CALL slaset(
'Full', lda, n, zero, zero, a, lda )
711 IF( itype.EQ.1 )
THEN
717 ELSE IF( itype.EQ.2 )
THEN
721 DO 80 jcol = 1, mnmin
722 a( jcol, jcol ) = anorm
725 ELSE IF( itype.EQ.4 )
THEN
729 CALL slatms( mnmin, mnmin,
'S', iseed,
'N', work, imode,
730 $ cond, anorm, 0, 0,
'N', a, lda,
731 $ work( mnmin+1 ), iinfo )
733 ELSE IF( itype.EQ.5 )
THEN
737 CALL slatms( mnmin, mnmin,
'S', iseed,
'S', work, imode,
738 $ cond, anorm, m, n,
'N', a, lda,
739 $ work( mnmin+1 ), iinfo )
741 ELSE IF( itype.EQ.6 )
THEN
745 CALL slatms( m, n,
'S', iseed,
'N', work, imode, cond,
746 $ anorm, m, n,
'N', a, lda, work( mnmin+1 ),
749 ELSE IF( itype.EQ.7 )
THEN
753 CALL slatmr( mnmin, mnmin,
'S', iseed,
'N', work, 6, one,
754 $ one,
'T',
'N', work( mnmin+1 ), 1, one,
755 $ work( 2*mnmin+1 ), 1, one,
'N', iwork, 0, 0,
756 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
758 ELSE IF( itype.EQ.8 )
THEN
762 CALL slatmr( mnmin, mnmin,
'S', iseed,
'S', work, 6, one,
763 $ one,
'T',
'N', work( mnmin+1 ), 1, one,
764 $ work( m+mnmin+1 ), 1, one,
'N', iwork, m, n,
765 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
767 ELSE IF( itype.EQ.9 )
THEN
771 CALL slatmr( m, n,
'S', iseed,
'N', work, 6, one, one,
772 $
'T',
'N', work( mnmin+1 ), 1, one,
773 $ work( m+mnmin+1 ), 1, one,
'N', iwork, m, n,
774 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
776 ELSE IF( itype.EQ.10 )
THEN
780 temp1 = -two*log( ulp )
782 bd( j ) = exp( temp1*slarnd( 2, iseed ) )
784 $ be( j ) = exp( temp1*slarnd( 2, iseed ) )
798 IF( iinfo.EQ.0 )
THEN
803 CALL slatmr( mnmin, nrhs,
'S', iseed,
'N', work, 6,
804 $ one, one,
'T',
'N', work( mnmin+1 ), 1,
805 $ one, work( 2*mnmin+1 ), 1, one,
'N',
806 $ iwork, mnmin, nrhs, zero, one,
'NO', y,
807 $ ldx, iwork, iinfo )
809 CALL slatmr( m, nrhs,
'S', iseed,
'N', work, 6, one,
810 $ one,
'T',
'N', work( m+1 ), 1, one,
811 $ work( 2*m+1 ), 1, one,
'N', iwork, m,
812 $ nrhs, zero, one,
'NO', x, ldx, iwork,
819 IF( iinfo.NE.0 )
THEN
820 WRITE( nout, fmt = 9998 )
'Generator', iinfo, m, n,
830 IF( .NOT.bidiag )
THEN
835 CALL slacpy(
' ', m, n, a, lda, q, ldq )
836 CALL sgebrd( m, n, q, ldq, bd, be, work, work( mnmin+1 ),
837 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
841 IF( iinfo.NE.0 )
THEN
842 WRITE( nout, fmt = 9998 )
'SGEBRD', iinfo, m, n,
848 CALL slacpy(
' ', m, n, q, ldq, pt, ldpt )
860 CALL sorgbr(
'Q', m, mq, n, q, ldq, work,
861 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
865 IF( iinfo.NE.0 )
THEN
866 WRITE( nout, fmt = 9998 )
'SORGBR(Q)', iinfo, m, n,
874 CALL sorgbr(
'P', mnmin, n, m, pt, ldpt, work( mnmin+1 ),
875 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
879 IF( iinfo.NE.0 )
THEN
880 WRITE( nout, fmt = 9998 )
'SORGBR(P)', iinfo, m, n,
888 CALL sgemm(
'Transpose',
'No transpose', m, nrhs, m, one,
889 $ q, ldq, x, ldx, zero, y, ldx )
895 CALL sbdt01( m, n, 1, a, lda, q, ldq, bd, be, pt, ldpt,
896 $ work, result( 1 ) )
897 CALL sort01(
'Columns', m, mq, q, ldq, work, lwork,
899 CALL sort01(
'Rows', mnmin, n, pt, ldpt, work, lwork,
906 CALL scopy( mnmin, bd, 1, s1, 1 )
908 $
CALL scopy( mnmin-1, be, 1, work, 1 )
909 CALL slacpy(
' ', m, nrhs, y, ldx, z, ldx )
910 CALL slaset(
'Full', mnmin, mnmin, zero, one, u, ldpt )
911 CALL slaset(
'Full', mnmin, mnmin, zero, one, vt, ldpt )
913 CALL sbdsqr( uplo, mnmin, mnmin, mnmin, nrhs, s1, work, vt,
914 $ ldpt, u, ldpt, z, ldx, work( mnmin+1 ), iinfo )
918 IF( iinfo.NE.0 )
THEN
919 WRITE( nout, fmt = 9998 )
'SBDSQR(vects)', iinfo, m, n,
922 IF( iinfo.LT.0 )
THEN
933 CALL scopy( mnmin, bd, 1, s2, 1 )
935 $
CALL scopy( mnmin-1, be, 1, work, 1 )
937 CALL sbdsqr( uplo, mnmin, 0, 0, 0, s2, work, vt, ldpt, u,
938 $ ldpt, z, ldx, work( mnmin+1 ), iinfo )
942 IF( iinfo.NE.0 )
THEN
943 WRITE( nout, fmt = 9998 )
'SBDSQR(values)', iinfo, m, n,
946 IF( iinfo.LT.0 )
THEN
959 CALL sbdt03( uplo, mnmin, 1, bd, be, u, ldpt, s1, vt, ldpt,
960 $ work, result( 4 ) )
961 CALL sbdt02( mnmin, nrhs, y, ldx, z, ldx, u, ldpt, work,
963 CALL sort01(
'Columns', mnmin, mnmin, u, ldpt, work, lwork,
965 CALL sort01(
'Rows', mnmin, mnmin, vt, ldpt, work, lwork,
972 DO 110 i = 1, mnmin - 1
973 IF( s1( i ).LT.s1( i+1 ) )
974 $ result( 8 ) = ulpinv
975 IF( s1( i ).LT.zero )
976 $ result( 8 ) = ulpinv
978 IF( mnmin.GE.1 )
THEN
979 IF( s1( mnmin ).LT.zero )
980 $ result( 8 ) = ulpinv
988 temp1 = abs( s1( j )-s2( j ) ) /
989 $ max( sqrt( unfl )*max( s1( 1 ), one ),
990 $ ulp*max( abs( s1( j ) ), abs( s2( j ) ) ) )
991 temp2 = max( temp1, temp2 )
999 temp1 = thresh*( half-ulp )
1001 DO 130 j = 0, log2ui
1009 result( 10 ) = temp1
1014 IF( .NOT.bidiag )
THEN
1015 CALL scopy( mnmin, bd, 1, s2, 1 )
1017 $
CALL scopy( mnmin-1, be, 1, work, 1 )
1019 CALL sbdsqr( uplo, mnmin, n, m, nrhs, s2, work, pt, ldpt,
1020 $ q, ldq, y, ldx, work( mnmin+1 ), iinfo )
1027 CALL sbdt01( m, n, 0, a, lda, q, ldq, s2, dumma, pt,
1028 $ ldpt, work, result( 11 ) )
1029 CALL sbdt02( m, nrhs, x, ldx, y, ldx, q, ldq, work,
1031 CALL sort01(
'Columns', m, mq, q, ldq, work, lwork,
1033 CALL sort01(
'Rows', mnmin, n, pt, ldpt, work, lwork,
1040 CALL scopy( mnmin, bd, 1, s1, 1 )
1042 $
CALL scopy( mnmin-1, be, 1, work, 1 )
1043 CALL slaset(
'Full', mnmin, mnmin, zero, one, u, ldpt )
1044 CALL slaset(
'Full', mnmin, mnmin, zero, one, vt, ldpt )
1046 CALL sbdsdc( uplo,
'I', mnmin, s1, work, u, ldpt, vt, ldpt,
1047 $ dum, idum, work( mnmin+1 ), iwork, iinfo )
1051 IF( iinfo.NE.0 )
THEN
1052 WRITE( nout, fmt = 9998 )
'SBDSDC(vects)', iinfo, m, n,
1055 IF( iinfo.LT.0 )
THEN
1058 result( 15 ) = ulpinv
1066 CALL scopy( mnmin, bd, 1, s2, 1 )
1068 $
CALL scopy( mnmin-1, be, 1, work, 1 )
1070 CALL sbdsdc( uplo,
'N', mnmin, s2, work, dum, 1, dum, 1,
1071 $ dum, idum, work( mnmin+1 ), iwork, iinfo )
1075 IF( iinfo.NE.0 )
THEN
1076 WRITE( nout, fmt = 9998 )
'SBDSDC(values)', iinfo, m, n,
1079 IF( iinfo.LT.0 )
THEN
1082 result( 18 ) = ulpinv
1091 CALL sbdt03( uplo, mnmin, 1, bd, be, u, ldpt, s1, vt, ldpt,
1092 $ work, result( 15 ) )
1093 CALL sort01(
'Columns', mnmin, mnmin, u, ldpt, work, lwork,
1095 CALL sort01(
'Rows', mnmin, mnmin, vt, ldpt, work, lwork,
1102 DO 150 i = 1, mnmin - 1
1103 IF( s1( i ).LT.s1( i+1 ) )
1104 $ result( 18 ) = ulpinv
1105 IF( s1( i ).LT.zero )
1106 $ result( 18 ) = ulpinv
1108 IF( mnmin.GE.1 )
THEN
1109 IF( s1( mnmin ).LT.zero )
1110 $ result( 18 ) = ulpinv
1118 temp1 = abs( s1( j )-s2( j ) ) /
1119 $ max( sqrt( unfl )*max( s1( 1 ), one ),
1120 $ ulp*max( abs( s1( 1 ) ), abs( s2( 1 ) ) ) )
1121 temp2 = max( temp1, temp2 )
1124 result( 19 ) = temp2
1130 IF( jtype.EQ.10 .OR. jtype.EQ.16 )
THEN
1134 result( 20:34 ) = zero
1142 iwwork = iwbz + 2*mnmin*(mnmin+1)
1143 mnmin2 = max( 1,mnmin*2 )
1145 CALL scopy( mnmin, bd, 1, work( iwbd ), 1 )
1147 $
CALL scopy( mnmin-1, be, 1, work( iwbe ), 1 )
1149 CALL sbdsvdx( uplo,
'V',
'A', mnmin, work( iwbd ),
1150 $ work( iwbe ), zero, zero, 0, 0, ns1, s1,
1151 $ work( iwbz ), mnmin2, work( iwwork ),
1156 IF( iinfo.NE.0 )
THEN
1157 WRITE( nout, fmt = 9998 )
'SBDSVDX(vects,A)', iinfo, m, n,
1160 IF( iinfo.LT.0 )
THEN
1163 result( 20 ) = ulpinv
1170 CALL scopy( mnmin, work( j ), 1, u( 1,i ), 1 )
1172 CALL scopy( mnmin, work( j ), 1, vt( i,1 ), ldpt )
1179 IF( jtype.EQ.9 )
THEN
1187 CALL scopy( mnmin, bd, 1, work( iwbd ), 1 )
1189 $
CALL scopy( mnmin-1, be, 1, work( iwbe ), 1 )
1191 CALL sbdsvdx( uplo,
'N',
'A', mnmin, work( iwbd ),
1192 $ work( iwbe ), zero, zero, 0, 0, ns2, s2,
1193 $ work( iwbz ), mnmin2, work( iwwork ),
1198 IF( iinfo.NE.0 )
THEN
1199 WRITE( nout, fmt = 9998 )
'SBDSVDX(values,A)', iinfo,
1200 $ m, n, jtype, ioldsd
1202 IF( iinfo.LT.0 )
THEN
1205 result( 24 ) = ulpinv
1212 CALL scopy( mnmin, s1, 1, work( iwbs ), 1 )
1221 CALL sbdt03( uplo, mnmin, 1, bd, be, u, ldpt, s1, vt,
1222 $ ldpt, work( iwbs+mnmin ), result( 20 ) )
1223 CALL sort01(
'Columns', mnmin, mnmin, u, ldpt,
1224 $ work( iwbs+mnmin ), lwork-mnmin,
1226 CALL sort01(
'Rows', mnmin, mnmin, vt, ldpt,
1227 $ work( iwbs+mnmin ), lwork-mnmin,
1231 DO 180 i = 1, mnmin - 1
1232 IF( s1( i ).LT.s1( i+1 ) )
1233 $ result( 23 ) = ulpinv
1234 IF( s1( i ).LT.zero )
1235 $ result( 23 ) = ulpinv
1237 IF( mnmin.GE.1 )
THEN
1238 IF( s1( mnmin ).LT.zero )
1239 $ result( 23 ) = ulpinv
1244 temp1 = abs( s1( j )-s2( j ) ) /
1245 $ max( sqrt( unfl )*max( s1( 1 ), one ),
1246 $ ulp*max( abs( s1( 1 ) ), abs( s2( 1 ) ) ) )
1247 temp2 = max( temp1, temp2 )
1249 result( 24 ) = temp2
1257 iseed2( i ) = iseed( i )
1259 IF( mnmin.LE.1 )
THEN
1263 il = 1 + int( ( mnmin-1 )*slarnd( 1, iseed2 ) )
1264 iu = 1 + int( ( mnmin-1 )*slarnd( 1, iseed2 ) )
1272 CALL scopy( mnmin, bd, 1, work( iwbd ), 1 )
1274 $
CALL scopy( mnmin-1, be, 1, work( iwbe ), 1 )
1276 CALL sbdsvdx( uplo,
'V',
'I', mnmin, work( iwbd ),
1277 $ work( iwbe ), zero, zero, il, iu, ns1, s1,
1278 $ work( iwbz ), mnmin2, work( iwwork ),
1283 IF( iinfo.NE.0 )
THEN
1284 WRITE( nout, fmt = 9998 )
'SBDSVDX(vects,I)', iinfo,
1285 $ m, n, jtype, ioldsd
1287 IF( iinfo.LT.0 )
THEN
1290 result( 25 ) = ulpinv
1297 CALL scopy( mnmin, work( j ), 1, u( 1,i ), 1 )
1299 CALL scopy( mnmin, work( j ), 1, vt( i,1 ), ldpt )
1306 CALL scopy( mnmin, bd, 1, work( iwbd ), 1 )
1308 $
CALL scopy( mnmin-1, be, 1, work( iwbe ), 1 )
1310 CALL sbdsvdx( uplo,
'N',
'I', mnmin, work( iwbd ),
1311 $ work( iwbe ), zero, zero, il, iu, ns2, s2,
1312 $ work( iwbz ), mnmin2, work( iwwork ),
1317 IF( iinfo.NE.0 )
THEN
1318 WRITE( nout, fmt = 9998 )
'SBDSVDX(values,I)', iinfo,
1319 $ m, n, jtype, ioldsd
1321 IF( iinfo.LT.0 )
THEN
1324 result( 29 ) = ulpinv
1336 CALL sbdt04( uplo, mnmin, bd, be, s1, ns1, u,
1337 $ ldpt, vt, ldpt, work( iwbs+mnmin ),
1339 CALL sort01(
'Columns', mnmin, ns1, u, ldpt,
1340 $ work( iwbs+mnmin ), lwork-mnmin,
1342 CALL sort01(
'Rows', ns1, mnmin, vt, ldpt,
1343 $ work( iwbs+mnmin ), lwork-mnmin,
1347 DO 220 i = 1, ns1 - 1
1348 IF( s1( i ).LT.s1( i+1 ) )
1349 $ result( 28 ) = ulpinv
1350 IF( s1( i ).LT.zero )
1351 $ result( 28 ) = ulpinv
1354 IF( s1( ns1 ).LT.zero )
1355 $ result( 28 ) = ulpinv
1360 temp1 = abs( s1( j )-s2( j ) ) /
1361 $ max( sqrt( unfl )*max( s1( 1 ), one ),
1362 $ ulp*max( abs( s1( 1 ) ), abs( s2( 1 ) ) ) )
1363 temp2 = max( temp1, temp2 )
1365 result( 29 ) = temp2
1371 CALL scopy( mnmin, work( iwbs ), 1, s1, 1 )
1373 IF( mnmin.GT.0 )
THEN
1375 vu = s1( il ) + max( half*abs( s1( il )-s1( il-1 ) ),
1376 $ ulp*anorm, two*rtunfl )
1378 vu = s1( 1 ) + max( half*abs( s1( mnmin )-s1( 1 ) ),
1379 $ ulp*anorm, two*rtunfl )
1381 IF( iu.NE.ns1 )
THEN
1382 vl = s1( iu ) - max( ulp*anorm, two*rtunfl,
1383 $ half*abs( s1( iu+1 )-s1( iu ) ) )
1385 vl = s1( ns1 ) - max( ulp*anorm, two*rtunfl,
1386 $ half*abs( s1( mnmin )-s1( 1 ) ) )
1390 IF( vl.GE.vu ) vu = max( vu*2, vu+vl+half )
1396 CALL scopy( mnmin, bd, 1, work( iwbd ), 1 )
1398 $
CALL scopy( mnmin-1, be, 1, work( iwbe ), 1 )
1400 CALL sbdsvdx( uplo,
'V',
'V', mnmin, work( iwbd ),
1401 $ work( iwbe ), vl, vu, 0, 0, ns1, s1,
1402 $ work( iwbz ), mnmin2, work( iwwork ),
1407 IF( iinfo.NE.0 )
THEN
1408 WRITE( nout, fmt = 9998 )
'SBDSVDX(vects,V)', iinfo,
1409 $ m, n, jtype, ioldsd
1411 IF( iinfo.LT.0 )
THEN
1414 result( 30 ) = ulpinv
1421 CALL scopy( mnmin, work( j ), 1, u( 1,i ), 1 )
1423 CALL scopy( mnmin, work( j ), 1, vt( i,1 ), ldpt )
1430 CALL scopy( mnmin, bd, 1, work( iwbd ), 1 )
1432 $
CALL scopy( mnmin-1, be, 1, work( iwbe ), 1 )
1434 CALL sbdsvdx( uplo,
'N',
'V', mnmin, work( iwbd ),
1435 $ work( iwbe ), vl, vu, 0, 0, ns2, s2,
1436 $ work( iwbz ), mnmin2, work( iwwork ),
1441 IF( iinfo.NE.0 )
THEN
1442 WRITE( nout, fmt = 9998 )
'SBDSVDX(values,V)', iinfo,
1443 $ m, n, jtype, ioldsd
1445 IF( iinfo.LT.0 )
THEN
1448 result( 34 ) = ulpinv
1460 CALL sbdt04( uplo, mnmin, bd, be, s1, ns1, u,
1461 $ ldpt, vt, ldpt, work( iwbs+mnmin ),
1463 CALL sort01(
'Columns', mnmin, ns1, u, ldpt,
1464 $ work( iwbs+mnmin ), lwork-mnmin,
1466 CALL sort01(
'Rows', ns1, mnmin, vt, ldpt,
1467 $ work( iwbs+mnmin ), lwork-mnmin,
1471 DO 250 i = 1, ns1 - 1
1472 IF( s1( i ).LT.s1( i+1 ) )
1473 $ result( 28 ) = ulpinv
1474 IF( s1( i ).LT.zero )
1475 $ result( 28 ) = ulpinv
1478 IF( s1( ns1 ).LT.zero )
1479 $ result( 28 ) = ulpinv
1484 temp1 = abs( s1( j )-s2( j ) ) /
1485 $ max( sqrt( unfl )*max( s1( 1 ), one ),
1486 $ ulp*max( abs( s1( 1 ) ), abs( s2( 1 ) ) ) )
1487 temp2 = max( temp1, temp2 )
1489 result( 34 ) = temp2
1496 IF( result( j ).GE.thresh )
THEN
1498 $
CALL slahd2( nout, path )
1499 WRITE( nout, fmt = 9999 )m, n, jtype, ioldsd, j,
1504 IF( .NOT.bidiag )
THEN
1515 CALL alasum( path, nout, nfail, ntest, 0 )
1521 9999
FORMAT(
' M=', i5,
', N=', i5,
', type ', i2,
', seed=',
1522 $ 4( i4,
',' ),
' test(', i2,
')=', g11.4 )
1523 9998
FORMAT(
' SCHKBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1524 $ i6,
', N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
subroutine alasum(type, nout, nfail, nrun, nerrs)
ALASUM
subroutine xerbla(srname, info)
subroutine sbdsdc(uplo, compq, n, d, e, u, ldu, vt, ldvt, q, iq, work, iwork, info)
SBDSDC
subroutine sbdsqr(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, c, ldc, work, info)
SBDSQR
subroutine sbdsvdx(uplo, jobz, range, n, d, e, vl, vu, il, iu, ns, s, z, ldz, work, iwork, info)
SBDSVDX
subroutine scopy(n, sx, incx, sy, incy)
SCOPY
subroutine sgebrd(m, n, a, lda, d, e, tauq, taup, work, lwork, info)
SGEBRD
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
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 sorgbr(vect, m, n, k, a, lda, tau, work, lwork, info)
SORGBR
subroutine sbdt01(m, n, kd, a, lda, q, ldq, d, e, pt, ldpt, work, resid)
SBDT01
subroutine sbdt02(m, n, b, ldb, c, ldc, u, ldu, work, resid)
SBDT02
subroutine sbdt03(uplo, n, kd, d, e, u, ldu, s, vt, ldvt, work, resid)
SBDT03
subroutine sbdt04(uplo, n, d, e, s, ns, u, ldu, vt, ldvt, work, resid)
SBDT04
subroutine schkbd(nsizes, mval, nval, ntypes, dotype, nrhs, iseed, thresh, a, lda, bd, be, s1, s2, x, ldx, y, z, q, ldq, pt, ldpt, u, vt, work, lwork, iwork, nout, info)
SCHKBD
subroutine slahd2(iounit, path)
SLAHD2
subroutine slatmr(m, n, dist, iseed, sym, d, mode, cond, dmax, rsign, grade, dl, model, condl, dr, moder, condr, pivtng, ipivot, kl, ku, sparse, anorm, pack, a, lda, iwork, info)
SLATMR
subroutine slatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
SLATMS
subroutine sort01(rowcol, m, n, u, ldu, work, lwork, resid)
SORT01