164 SUBROUTINE sdrvge( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, NMAX,
165 $ A, AFAC, ASAV, B, BSAV, X, XACT, S, WORK,
166 $ RWORK, IWORK, NOUT )
174 INTEGER NMAX, NN, NOUT, NRHS
179 INTEGER IWORK( * ), NVAL( * )
180 REAL A( * ), AFAC( * ), ASAV( * ), B( * ),
181 $ bsav( * ), rwork( * ), s( * ), work( * ),
189 PARAMETER ( ONE = 1.0e+0, zero = 0.0e+0 )
191 parameter( ntypes = 11 )
193 parameter( ntests = 7 )
195 parameter( ntran = 3 )
198 LOGICAL EQUIL, NOFACT, PREFAC, TRFCON, ZEROT
199 CHARACTER DIST, EQUED, FACT, TRANS,
TYPE, XTYPE
201 INTEGER I, IEQUED, IFACT, IMAT, IN, INFO, IOFF, ITRAN,
202 $ izero, k, k1, kl, ku, lda, lwork, mode, n, nb,
203 $ nbmin, nerrs, nfact, nfail, nimat, nrun, nt,
205 REAL AINVNM, AMAX, ANORM, ANORMI, ANORMO, CNDNUM,
206 $ COLCND, RCOND, RCONDC, RCONDI, RCONDO, ROLDC,
207 $ roldi, roldo, rowcnd, rpvgrw, rpvgrw_svxx
210 CHARACTER EQUEDS( 4 ), FACTS( 3 ), TRANSS( NTRAN )
211 INTEGER ISEED( 4 ), ISEEDY( 4 )
212 REAL RESULT( ), BERR( NRHS ),
213 $ errbnds_n( nrhs, 3 ), errbnds_c( nrhs, 3 )
217 REAL SGET06, SLAMCH, SLANGE, SLANTR, SLA_GERPVGRW
218 EXTERNAL lsame, sget06, slamch, slange, slantr,
236 COMMON / infoc / infot, nunit, ok, lerr
237 COMMON / srnamc / srnamt
240 DATA iseedy / 1988, 1989, 1990, 1991 /
241 DATA transs /
'N',
'T',
'C' /
242 DATA facts /
'F',
'N',
'E' /
243 DATA equeds /
'N',
'R',
'C',
'B' /
249 path( 1: 1 ) =
'Single precision'
255 iseed( i ) = iseedy( i )
261 $
CALL serrvx( path, nout )
281 DO 80 IMAT = 1, NIMAT
285.NOT.
IF( DOTYPE( IMAT ) )
290.GE..AND..LE.
ZEROT = IMAT5 IMAT7
291.AND..LT.
IF( ZEROT NIMAT-4 )
297 CALL SLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE,
299 RCONDC = ONE / CNDNUM
302 CALL SLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE, CNDNUM,
303 $ ANORM, KL, KU, 'no packing
', A, LDA, WORK,
309 CALL ALAERH( PATH, 'slatms', INFO, 0, ' ', N, N, -1, -1,
310 $ -1, IMAT, NFAIL, NERRS, NOUT )
320.EQ.
ELSE IF( IMAT6 ) THEN
325 IOFF = ( IZERO-1 )*LDA
331 CALL SLASET( 'full
', N, N-IZERO+1, ZERO, ZERO,
340 CALL SLACPY( 'full
', N, N, A, LDA, ASAV, LDA )
343 EQUED = EQUEDS( IEQUED )
344.EQ.
IF( IEQUED1 ) THEN
350 DO 60 IFACT = 1, NFACT
351 FACT = FACTS( IFACT )
352 PREFAC = LSAME( FACT, 'f
' )
353 NOFACT = LSAME( FACT, 'n
' )
354 EQUIL = LSAME( FACT, 'e
' )
362.NOT.
ELSE IF( NOFACT ) THEN
369 CALL SLACPY( 'full
', N, N, ASAV, LDA, AFAC, LDA )
370.OR..GT.
IF( EQUIL IEQUED1 ) THEN
375 CALL SGEEQU( N, N, AFAC, LDA, S, S( N+1 ),
376 $ ROWCND, COLCND, AMAX, INFO )
377.EQ..AND..GT.
IF( INFO0 N0 ) THEN
378 IF( LSAME( EQUED, 'r
' ) ) THEN
381 ELSE IF( LSAME( EQUED, 'c
' ) ) THEN
384 ELSE IF( LSAME( EQUED, 'b
' ) ) THEN
391 CALL SLAQGE( N, N, AFAC, LDA, S, S( N+1 ),
392 $ ROWCND, COLCND, AMAX, EQUED )
406 ANORMO = SLANGE( '1
', N, N, AFAC, LDA, RWORK )
407 ANORMI = SLANGE( 'i
', N, N, AFAC, LDA, RWORK )
411 CALL SGETRF( N, N, AFAC, LDA, IWORK, INFO )
415 CALL SLACPY( 'full
', N, N, AFAC, LDA, A, LDA )
416 LWORK = NMAX*MAX( 3, NRHS )
417 CALL SGETRI( N, A, LDA, IWORK, WORK, LWORK, INFO )
421 AINVNM = SLANGE( '1
', N, N, A, LDA, RWORK )
422.LE..OR..LE.
IF( ANORMOZERO AINVNMZERO ) THEN
425 RCONDO = ( ONE / ANORMO ) / AINVNM
430 AINVNM = SLANGE( 'i
', N, N, A, LDA, RWORK )
431.LE..OR..LE.
IF( ANORMIZERO AINVNMZERO ) THEN
434 RCONDI = ( ONE / ANORMI ) / AINVNM
438 DO 50 ITRAN = 1, NTRAN
442 TRANS = TRANSS( ITRAN )
443.EQ.
IF( ITRAN1 ) THEN
451 CALL SLACPY( 'full
', N, N, ASAV, LDA, A, LDA )
456 CALL SLARHS( PATH, XTYPE, 'full
', TRANS, N, N, KL,
457 $ KU, NRHS, A, LDA, XACT, LDA, B, LDA,
460 CALL SLACPY( 'full
', N, NRHS, B, LDA, BSAV, LDA )
462.AND..EQ.
IF( NOFACT ITRAN1 ) THEN
469 CALL SLACPY( 'full
', N, N, A, LDA, AFAC, LDA )
470 CALL SLACPY( 'full
', N, NRHS, B, LDA, X, LDA )
473 CALL SGESV( N, NRHS, AFAC, LDA, IWORK, X, LDA,
479 $ CALL ALAERH( PATH, 'sgesv ', INFO, IZERO,
480 $ ' ', N, N, -1, -1, NRHS, IMAT,
481 $ NFAIL, NERRS, NOUT )
486 CALL SGET01( N, N, A, LDA, AFAC, LDA, IWORK,
487 $ RWORK, RESULT( 1 ) )
489.EQ.
IF( IZERO0 ) THEN
493 CALL SLACPY( 'full
', N, NRHS, B, LDA, WORK,
495 CALL SGET02( 'no transpose
', N, N, NRHS, A,
496 $ LDA, X, LDA, WORK, LDA, RWORK,
501 CALL SGET04( N, NRHS, X, LDA, XACT, LDA,
502 $ RCONDC, RESULT( 3 ) )
510.GE.
IF( RESULT( K )THRESH ) THEN
511.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
512 $ CALL ALADHD( NOUT, PATH )
513 WRITE( NOUT, FMT = 9999 )'sgesv ', N,
514 $ IMAT, K, RESULT( K )
524 $ CALL SLASET( 'full
', N, N, ZERO, ZERO, AFAC,
526 CALL SLASET( 'full
', N, NRHS, ZERO, ZERO, X, LDA )
527.GT..AND..GT.
IF( IEQUED1 N0 ) THEN
532 CALL SLAQGE( N, N, A, LDA, S, S( N+1 ), ROWCND,
533 $ COLCND, AMAX, EQUED )
540 CALL SGESVX( FACT, TRANS, N, NRHS, A, LDA, AFAC,
541 $ LDA, IWORK, EQUED, S, S( N+1 ), B,
542 $ LDA, X, LDA, RCOND, RWORK,
543 $ RWORK( NRHS+1 ), WORK, IWORK( N+1 ),
549 $ CALL ALAERH( PATH, 'sgesvx', INFO, IZERO,
550 $ FACT // TRANS, N, N, -1, -1, NRHS,
551 $ IMAT, NFAIL, NERRS, NOUT )
557 RPVGRW = SLANTR( 'm
', 'u
', 'n
', INFO, INFO,
559.EQ.
IF( RPVGRWZERO ) THEN
562 RPVGRW = SLANGE( 'm
', N, INFO, A, LDA,
566 RPVGRW = SLANTR( 'm
', 'u
', 'n
', N, N, AFAC, LDA,
568.EQ.
IF( RPVGRWZERO ) THEN
571 RPVGRW = SLANGE( 'm
', N, N, A, LDA, WORK ) /
575 RESULT( 7 ) = ABS( RPVGRW-WORK( 1 ) ) /
576 $ MAX( WORK( 1 ), RPVGRW ) /
579.NOT.
IF( PREFAC ) THEN
584 CALL SGET01( N, N, A, LDA, AFAC, LDA, IWORK,
585 $ RWORK( 2*NRHS+1 ), RESULT( 1 ) )
596 CALL SLACPY( 'full
', N, NRHS, BSAV, LDA, WORK,
598 CALL SGET02( TRANS, N, N, NRHS, ASAV, LDA, X,
599 $ LDA, WORK, LDA, RWORK( 2*NRHS+1 ),
604.OR..AND.
IF( NOFACT ( PREFAC LSAME( EQUED,
606 CALL SGET04( N, NRHS, X, LDA, XACT, LDA,
607 $ RCONDC, RESULT( 3 ) )
609.EQ.
IF( ITRAN1 ) THEN
614 CALL SGET04( N, NRHS, X, LDA, XACT, LDA,
615 $ ROLDC, RESULT( 3 ) )
621 CALL SGET07( TRANS, N, NRHS, ASAV, LDA, B, LDA,
622 $ X, LDA, XACT, LDA, RWORK, .TRUE.,
623 $ RWORK( NRHS+1 ), RESULT( 4 ) )
631 RESULT( 6 ) = SGET06( RCOND, RCONDC )
636.NOT.
IF( TRFCON ) THEN
638.GE.
IF( RESULT( K )THRESH ) THEN
639.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
640 $ CALL ALADHD( NOUT, PATH )
642 WRITE( NOUT, FMT = 9997 )'sgesvx',
643 $ FACT, TRANS, N, EQUED, IMAT, K,
646 WRITE( NOUT, FMT = 9998 )'sgesvx',
647 $ FACT, TRANS, N, IMAT, K, RESULT( K )
654.GE..AND..NOT.
IF( RESULT( 1 )THRESH PREFAC )
656.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
657 $ CALL ALADHD( NOUT, PATH )
659 WRITE( NOUT, FMT = 9997 )'sgesvx', FACT,
660 $ TRANS, N, EQUED, IMAT, 1, RESULT( 1 )
662 WRITE( NOUT, FMT = 9998 )'sgesvx', FACT,
663 $ TRANS, N, IMAT, 1, RESULT( 1 )
668.GE.
IF( RESULT( 6 )THRESH ) THEN
669.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
670 $ CALL ALADHD( NOUT, PATH )
672 WRITE( NOUT, FMT = 9997 )'sgesvx', FACT,
673 $ TRANS, N, EQUED, IMAT, 6, RESULT( 6 )
675 WRITE( NOUT, FMT = 9998 )'sgesvx', FACT,
676 $ TRANS, N, IMAT, 6, RESULT( 6 )
681.GE.
IF( RESULT( 7 )THRESH ) THEN
682.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
683 $ CALL ALADHD( NOUT, PATH )
685 WRITE( NOUT, FMT = 9997 )'sgesvx', FACT,
686 $ TRANS, N, EQUED, IMAT, 7, RESULT( 7 )
688 WRITE( NOUT, FMT = 9998 )'sgesvx', FACT,
689 $ TRANS, N, IMAT, 7, RESULT( 7 )
701 CALL SLACPY( 'full
', N, N, ASAV, LDA, A, LDA )
702 CALL SLACPY( 'full
', N, NRHS, BSAV, LDA, B, LDA )
705 $ CALL SLASET( 'full', n, n, zero, zero, afac,
707 CALL slaset(
'Full', n, nrhs, zero, zero, x, lda )
708 IF( iequed.GT.1 .AND. n.GT.0 )
THEN
713 CALL slaqge( n, n, a, lda, s, s( n+1 ), rowcnd,
714 $ colcnd, amax, equed )
722 CALL sgesvxx( fact, trans, n, nrhs, a, lda, afac,
723 $ lda, iwork, equed, s, s( n+1 ), b, lda, x,
724 $ lda, rcond, rpvgrw_svxx, berr, n_err_bnds,
725 $ errbnds_n, errbnds_c, 0, zero, work,
726 $ iwork( n+1 ), info )
730 IF( info.EQ.n+1 )
GOTO 50
731 IF( info.NE.izero )
THEN
732 CALL alaerh( path,
'SGESVXX', info, izero,
733 $ fact // trans, n, n, -1, -1, nrhs,
734 $ imat, nfail, nerrs, nout )
742 IF ( info .GT. 0 .AND. info .LT. n+1 )
THEN
743 rpvgrw = sla_gerpvgrw
746 rpvgrw = sla_gerpvgrw
747 $ (n, n, a, lda, afac, lda)
750 result( 7 ) = abs( rpvgrw-rpvgrw_svxx ) /
751 $
max( rpvgrw_svxx, rpvgrw ) /
754 IF( .NOT.prefac )
THEN
759 CALL sget01( n, n, a, lda, afac, lda, iwork,
760 $ rwork( 2*nrhs+1 ), result( 1 ) )
771 CALL slacpy(
'Full', n, nrhs, bsav, lda, work,
773 CALL sget02( trans, n, n, nrhs, asav, lda, x,
774 $ lda, work, lda, rwork( 2*nrhs+1 ),
779 IF( nofact .OR. ( prefac .AND. lsame( equed,
781 CALL sget04( n, nrhs, x, lda, xact, lda,
782 $ rcondc, result( 3 ) )
784 IF( itran.EQ.1 )
THEN
789 CALL sget04( n, nrhs, x, lda, xact, lda,
790 $ roldc, result( 3 ) )
799 result( 6 ) = sget06( rcond, rcondc )
804 IF( .NOT.trfcon )
THEN
806 IF( result( k ).GE.thresh )
THEN
807 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
808 $
CALL aladhd( nout, path )
810 WRITE( nout, fmt = 9997 )'
sgesvxx',
811 $ FACT, TRANS, N, EQUED, IMAT, K,
814 WRITE( NOUT, FMT = 9998 )'sgesvxx',
815 $ FACT, TRANS, N, IMAT, K, RESULT( K )
822.GE..AND..NOT.
IF( RESULT( 1 )THRESH PREFAC )
824.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
825 $ CALL ALADHD( NOUT, PATH )
827 WRITE( NOUT, FMT = 9997 )'sgesvxx', FACT,
828 $ TRANS, N, EQUED, IMAT, 1, RESULT( 1 )
830 WRITE( NOUT, FMT = 9998 )'sgesvxx', FACT,
831 $ TRANS, N, IMAT, 1, RESULT( 1 )
836.GE.
IF( RESULT( 6 )THRESH ) THEN
837.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
838 $ CALL ALADHD( NOUT, PATH )
840 WRITE( NOUT, FMT = 9997 )'sgesvxx', FACT,
841 $ TRANS, N, EQUED, IMAT, 6, RESULT( 6 )
843 WRITE( NOUT, FMT = 9998 )'sgesvxx', FACT,
844 $ TRANS, N, IMAT, 6, RESULT( 6 )
849.GE.
IF( RESULT( 7 )THRESH ) THEN
850.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
851 $ CALL ALADHD( NOUT, PATH )
853 WRITE( NOUT, FMT = 9997 )'sgesvxx', FACT,
854 $ TRANS, N, EQUED, IMAT, 7, RESULT( 7 )
856 WRITE( NOUT, FMT = 9998 )'sgesvxx', FACT,
857 $ TRANS, N, IMAT, 7, RESULT( 7 )
873 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
878 CALL SEBCHVXX(THRESH, PATH)
880 9999 FORMAT( 1X, A, ', n =
', I5, ',
type ', I2, ', test(
', I2, ') =
',
882 9998 FORMAT( 1X, A, ', fact=
''', A1, ''', trans=
''', A1, ''', n=
', I5,
883 $ ',
type ', I2, ', test(
', I1, ')=
', G12.5 )
884 9997 FORMAT( 1X, A, ', fact=
''', A1, ''', trans=
''', A1, ''', n=
', I5,
885 $ ', equed=
''', A1, ''',
type ', i2,
', test(', i1,
')=',
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 xlaenv(ispec, nvalue)
XLAENV
subroutine alasvm(type, nout, nfail, nrun, nerrs)
ALASVM
subroutine aladhd(iounit, path)
ALADHD
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine slaqge(m, n, a, lda, r, c, rowcnd, colcnd, amax, equed)
SLAQGE scales a general rectangular matrix, using row and column scaling factors computed by sgeequ.
subroutine sgetrf(m, n, a, lda, ipiv, info)
SGETRF
subroutine sgeequ(m, n, a, lda, r, c, rowcnd, colcnd, amax, info)
SGEEQU
subroutine sgetri(n, a, lda, ipiv, work, lwork, info)
SGETRI
subroutine sgesvxx(fact, trans, n, nrhs, a, lda, af, ldaf, ipiv, equed, r, c, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, iwork, info)
SGESVXX computes the solution to system of linear equations A * X = B for GE matrices
subroutine sgesv(n, nrhs, a, lda, ipiv, b, ldb, info)
SGESV computes the solution to system of linear equations A * X = B for GE matrices (simple driver)
subroutine sgesvx(fact, trans, n, nrhs, a, lda, af, ldaf, ipiv, equed, r, c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)
SGESVX computes the solution to system of linear equations A * X = B for GE matrices
subroutine slatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
SLATMS
subroutine sget02(trans, m, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
SGET02
subroutine slarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
SLARHS
subroutine serrvx(path, nunit)
SERRVX
subroutine sdrvge(dotype, nn, nval, nrhs, thresh, tsterr, nmax, a, afac, asav, b, bsav, x, xact, s, work, rwork, iwork, nout)
SDRVGE
subroutine sget01(m, n, a, lda, afac, ldafac, ipiv, rwork, resid)
SGET01
subroutine sget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
SGET04
subroutine sget07(trans, n, nrhs, a, lda, b, ldb, x, ldx, xact, ldxact, ferr, chkferr, berr, reslts)
SGET07
subroutine slatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
SLATB4