164 SUBROUTINE ddrvge( 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
175 DOUBLE PRECISION THRESH
179 INTEGER IWORK( * ), NVAL( * )
180 DOUBLE PRECISION A( * ), AFAC( * ), ASAV( * ), B( * ),
181 $ bsav( * ), rwork( * ), s( * ), work( * ),
188 DOUBLE PRECISION ONE, ZERO
189 PARAMETER ( ONE = 1.0d+0, zero = 0.0d+0 )
191 parameter( ntypes = 11 )
193 parameter( ntests = 7 )
195 parameter( ntran = 3 )
198 LOGICAL EQUIL, NOFACT, PREFAC, TRFCON, ZEROT
199 CHARACTER , EQUED, FACT, TRANS,
TYPE, XTYPE
201 INTEGER I, IEQUED, , 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 DOUBLE PRECISION , , 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 DOUBLE PRECISION RESULT( NTESTS ), BERR( NRHS ),
213 $ errbnds_n( nrhs, 3 ), errbnds_c( nrhs, 3 )
217 DOUBLE PRECISION DGET06, DLAMCH, DLANGE, DLANTR, DLA_GERPVGRW
218 EXTERNAL lsame, dget06, dlamch, dlange, dlantr,
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 ) =
'Double precision'
255 iseed( i ) = iseedy( i )
261 $
CALL derrvx( path, nout )
281 DO 80 imat = 1, nimat
285 IF( .NOT.dotype( imat ) )
290 zerot = imat.GE.5 .AND. imat.LE.7
291 IF( zerot .AND. n.LT.imat-4 )
297 CALL dlatb4( path, imat, n, n,
TYPE, KL, KU, ANORM, MODE,
299 rcondc = one / cndnum
302 CALL dlatms( n, n, dist, iseed,
TYPE, RWORK, MODE, CNDNUM,
303 $ anorm, kl, ku,
'No packing', a, lda, work,
309 CALL alaerh( path,
'DLATMS', info, 0,
' ', n, n, -1, -1,
310 $ -1, imat, nfail, nerrs, nout )
320 ELSE IF( imat.EQ.6 )
THEN
325 ioff = ( izero-1 )*lda
331 CALL dlaset(
'Full', n, n-izero+1, zero, zero,
340 CALL dlacpy(
'Full', n, n, a, lda, asav, lda )
343 equed = equeds( iequed )
344 IF( iequed.EQ.1 )
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 ELSE IF( .NOT.nofact )
THEN
369 CALL dlacpy(
'Full', n, n, asav, lda, afac, lda )
370 IF( equil .OR. iequed.GT.1 )
THEN
375 CALL dgeequ( n, n, afac, lda, s, s( n+1 ),
376 $ rowcnd, colcnd, amax, info )
377 IF( info.EQ.0 .AND. n.GT.0 )
THEN
378 IF( lsame( equed,
'R' ) )
THEN
381 ELSE IF( lsame( equed,
'C' ) )
THEN
384 ELSE IF( lsame( equed,
'B' ) )
THEN
391 CALL dlaqge( n, n, afac, lda, s, s( n+1 ),
392 $ rowcnd, colcnd, amax, equed )
406 anormo = dlange(
'1', n, n, afac, lda, rwork )
407 anormi = dlange(
'I', n, n, afac, lda, rwork )
411 CALL dgetrf( n, n, afac, lda, iwork, info )
415 CALL dlacpy(
'Full', n, n, afac, lda, a, lda )
416 lwork = nmax*
max( 3, nrhs )
417 CALL dgetri( n, a, lda, iwork, work, lwork, info )
421 ainvnm = dlange(
'1', n, n, a, lda, rwork )
422 IF( anormo.LE.zero .OR. ainvnm.LE.zero )
THEN
425 rcondo = ( one / anormo ) / ainvnm
430 ainvnm = dlange(
'I', n, n, a, lda, rwork )
431 IF( anormi.LE.zero .OR. ainvnm.LE.zero )
THEN
434 rcondi = ( one / anormi ) / ainvnm
438 DO 50 itran = 1, ntran
442 trans = transs( itran )
443 IF( itran.EQ.1 )
THEN
451 CALL dlacpy(
'Full', n, n, asav, lda, a, lda )
456 CALL dlarhs( path, xtype,
'Full', trans, n, n, kl,
457 $ ku, nrhs, a, lda, xact, lda, b, lda,
460 CALL dlacpy(
'Full', n, nrhs, b, lda, bsav, lda )
462 IF( nofact .AND. itran.EQ.1 )
THEN
469 CALL dlacpy(
'Full', n, n, a, lda, afac, lda )
470 CALL dlacpy(
'Full', n, nrhs, b, lda, x, lda )
473 CALL dgesv( n, nrhs, afac, lda, iwork, x, lda,
479 $
CALL alaerh( path,
'DGESV ', info, izero,
480 $
' ', n, n, -1, -1, nrhs, imat,
481 $ nfail, nerrs, nout )
486 CALL dget01( n, n, a, lda, afac, lda, iwork,
487 $ rwork, result( 1 ) )
489 IF( izero.EQ.0 )
THEN
493 CALL dlacpy(
'Full', n, nrhs, b, lda, work,
495 CALL dget02(
'No transpose', n, n, nrhs, a,
501 CALL dget04( n, nrhs, x, lda, xact, lda,
502 $ rcondc, result( 3 ) )
510 IF( result( k ).GE.thresh )
THEN
511 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
512 $
CALL aladhd( nout, path )
513 WRITE( nout, fmt = 9999 )
'DGESV ', n,
514 $ imat, k, result( k )
524 $
CALL dlaset(
'Full', n, n, zero, zero, afac,
526 CALL dlaset( 'full
', N, NRHS, ZERO, ZERO, X, LDA )
527.GT..AND..GT.
IF( IEQUED1 N0 ) THEN
532 CALL DLAQGE( N, N, A, LDA, S, S( N+1 ), ROWCND,
533 $ COLCND, AMAX, EQUED )
540 CALL DGESVX( 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, 'dgesvx', INFO, IZERO,
550 $ FACT // TRANS, N, N, -1, -1, NRHS,
551 $ IMAT, NFAIL, NERRS, NOUT )
557 RPVGRW = DLANTR( 'm
', 'u
', 'n
', INFO, INFO,
559.EQ.
IF( RPVGRWZERO ) THEN
562 RPVGRW = DLANGE( 'm
', N, INFO, A, LDA,
566 RPVGRW = DLANTR( 'm
', 'u
', 'n
', N, N, AFAC, LDA,
568.EQ.
IF( RPVGRWZERO ) THEN
571 RPVGRW = DLANGE( '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 DGET01( N, N, A, LDA, AFAC, LDA, IWORK,
585 $ RWORK( 2*NRHS+1 ), RESULT( 1 ) )
596 CALL DLACPY( 'full
', N, NRHS, BSAV, LDA, WORK,
598 CALL DGET02( 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 DGET04( N, NRHS, X, LDA, XACT, LDA,
607 $ RCONDC, RESULT( 3 ) )
609.EQ.
IF( ITRAN1 ) THEN
614 CALL DGET04( N, NRHS, X, LDA, XACT, LDA,
615 $ ROLDC, RESULT( 3 ) )
621 CALL DGET07( TRANS, N, NRHS, ASAV, LDA, B, LDA,
622 $ X, LDA, XACT, LDA, RWORK, .TRUE.,
623 $ RWORK( NRHS+1 ), RESULT( 4 ) )
631 RESULT( 6 ) = DGET06( 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 )'dgesvx',
643 $ FACT, TRANS, N, EQUED, IMAT, K,
646 WRITE( NOUT, FMT = 9998 )'dgesvx',
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 )'dgesvx', FACT,
660 $ TRANS, N, EQUED, IMAT, 1, RESULT( 1 )
662 WRITE( NOUT, FMT = 9998 )'dgesvx', 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 )'dgesvx', FACT,
673 $ TRANS, N, EQUED, IMAT, 6, RESULT( 6 )
675 WRITE( NOUT, FMT = 9998 )'dgesvx', 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 )'dgesvx', FACT,
686 $ TRANS, N, EQUED, IMAT, 7, RESULT( 7 )
688 WRITE( NOUT, FMT = 9998 )'dgesvx', FACT,
689 $ TRANS, N, IMAT, 7, RESULT( 7 )
701 CALL DLACPY( 'full
', N, N, ASAV, LDA, A, LDA )
702 CALL DLACPY( 'full
', N, NRHS, BSAV, LDA, B, LDA )
705 $ CALL DLASET( 'full
', N, N, ZERO, ZERO, AFAC,
707 CALL DLASET( 'full
', N, NRHS, ZERO, ZERO, X, LDA )
708.GT..AND..GT.
IF( IEQUED1 N0 ) THEN
713 CALL DLAQGE( N, N, A, LDA, S, S( N+1 ), ROWCND,
714 $ COLCND, AMAX, EQUED )
722 CALL DGESVXX( 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.EQ.
IF( INFON+1 ) GOTO 50
731.NE.
IF( INFOIZERO ) THEN
732 CALL ALAERH( PATH, 'dgesvxx', INFO, IZERO,
733 $ FACT // TRANS, N, N, -1, -1, NRHS,
734 $ IMAT, NFAIL, NERRS, NOUT )
742.GT..AND..LT.
IF ( INFO 0 INFO N+1 ) THEN
743 RPVGRW = DLA_GERPVGRW
744 $ (N, INFO, A, LDA, AFAC, LDA)
746 RPVGRW = DLA_GERPVGRW
747 $ (N, N, A, LDA, AFAC, LDA)
750 RESULT( 7 ) = ABS( RPVGRW-RPVGRW_SVXX ) /
751 $ MAX( RPVGRW_SVXX, RPVGRW ) /
754.NOT.
IF( PREFAC ) THEN
759 CALL DGET01( N, N, A, LDA, AFAC, LDA, IWORK,
760 $ RWORK( 2*NRHS+1 ), RESULT( 1 ) )
771 CALL DLACPY( 'full
', N, NRHS, BSAV, LDA, WORK,
773 CALL DGET02( TRANS, N, N, NRHS, ASAV, LDA, X,
774 $ LDA, WORK, LDA, RWORK( 2*NRHS+1 ),
779.OR..AND.
IF( NOFACT ( PREFAC LSAME( EQUED,
781 CALL DGET04( N, NRHS, X, LDA, XACT, LDA,
782 $ RCONDC, RESULT( 3 ) )
784.EQ.
IF( ITRAN1 ) THEN
789 CALL DGET04( N, NRHS, X, LDA, XACT, LDA,
790 $ ROLDC, RESULT( 3 ) )
799 RESULT( 6 ) = DGET06( RCOND, RCONDC )
804.NOT.
IF( TRFCON ) THEN
806.GE.
IF( RESULT( K )THRESH ) THEN
807.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
808 $ CALL ALADHD( NOUT, PATH )
810 WRITE( NOUT, FMT = 9997 )'dgesvxx',
811 $ FACT, TRANS, N, EQUED, IMAT, K,
814 WRITE( NOUT, FMT = 9998 )'dgesvxx',
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 )'dgesvxx', FACT,
828 $ TRANS, N, EQUED, IMAT, 1, RESULT( 1 )
830 WRITE( NOUT, FMT = 9998 )'dgesvxx', 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 )'dgesvxx', FACT,
841 $ TRANS, N, EQUED, IMAT, 6, RESULT( 6 )
843 WRITE( NOUT, FMT = 9998 )'dgesvxx', 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 )'dgesvxx', FACT,
854 $ TRANS, N, EQUED, IMAT, 7, RESULT( 7 )
856 WRITE( NOUT, FMT = 9998 )'dgesvxx', FACT,
857 $ TRANS, N, IMAT, 7, RESULT( 7 )
873 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
878 CALL DEBCHVXX( 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 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 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 dlaqge(m, n, a, lda, r, c, rowcnd, colcnd, amax, equed)
DLAQGE scales a general rectangular matrix, using row and column scaling factors computed by sgeequ.
subroutine dgeequ(m, n, a, lda, r, c, rowcnd, colcnd, amax, info)
DGEEQU
subroutine dgetri(n, a, lda, ipiv, work, lwork, info)
DGETRI
subroutine dgetrf(m, n, a, lda, ipiv, info)
DGETRF
subroutine dgesvxx(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)
DGESVXX computes the solution to system of linear equations A * X = B for GE matrices
subroutine dgesvx(fact, trans, n, nrhs, a, lda, af, ldaf, ipiv, equed, r, c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)
DGESVX computes the solution to system of linear equations A * X = B for GE matrices
subroutine dgesv(n, nrhs, a, lda, ipiv, b, ldb, info)
DGESV computes the solution to system of linear equations A * X = B for GE matrices
subroutine dget02(trans, m, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
DGET02
subroutine dlarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
DLARHS
subroutine dget01(m, n, a, lda, afac, ldafac, ipiv, rwork, resid)
DGET01
subroutine derrvx(path, nunit)
DERRVX
subroutine dlatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
DLATB4
subroutine dget07(trans, n, nrhs, a, lda, b, ldb, x, ldx, xact, ldxact, ferr, chkferr, berr, reslts)
DGET07
subroutine ddrvge(dotype, nn, nval, nrhs, thresh, tsterr, nmax, a, afac, asav, b, bsav, x, xact, s, work, rwork, iwork, nout)
DDRVGE
subroutine dget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
DGET04
subroutine dlatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
DLATMS