164 SUBROUTINE cdrvge( 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 RWORK( * ), ( * )
181 COMPLEX A( * ), AFAC( * ), ASAV( * ), B( * ),
182 $ bsav( * ), work( * ), x( * ), xact( * )
189 PARAMETER ( ONE = 1.0e+0, zero = 0.0e+0 )
191 parameter( ntypes = 11 )
193 parameter( ntests = 7 )
195 parameter( ntran = 3 )
198 LOGICAL , NOFACT, PREFAC, TRFCON, ZEROT
199 CHARACTER DIST, EQUED, FACT, TRANS,
TYPE, XTYPE
201 INTEGER I, IEQUED, IFACT, IMAT, , 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 $ , 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 RDUM( 1 ), RESULT( NTESTS ), BERR( NRHS ),
213 $ errbnds_n( nrhs, 3 ), errbnds_c( nrhs, 3 )
217 REAL CLANGE, CLANTR, SGET06, SLAMCH, CLA_GERPVGRW
218 EXTERNAL lsame, clange, clantr, sget06
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 ) =
'Complex precision'
255 iseed( i ) = iseedy( i )
261 $
CALL cerrvx( 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 clatb4( path, imat, n, n,
TYPE, KL, , ANORM, MODE,
299 rcondc = one / cndnum
302 CALL clatms( n, n, dist, iseed,
TYPE, RWORK, MODE, CNDNUM,
303 $ anorm, kl, ku,
'No packing', a, lda, work,
309 CALL alaerh( path,
'CLATMS', info, 0,
' ', n, n, -1, -1,
310 $ -1, imat, nfail, nerrs, nout )
320 ELSE IF( imat.EQ.6 )
THEN
325 ioff = ( izero-1 )*lda
332 $
cmplx( zero ), a( ioff+1 ), lda )
340 CALL clacpy(
'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 clacpy(
'Full', n, n, asav, lda, afac, lda )
370 IF( equil .OR. iequed.GT.1 )
THEN
375 CALL cgeequ( 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 claqge( n, n, afac, lda, s, s( n+1 ),
392 $ rowcnd, colcnd, amax, equed )
406 anormo = clange(
'1', n, n, afac, lda, rwork )
411 CALL cgetrf( n, n, afac, lda, iwork, info )
415 CALL clacpy(
'Full', n, n, afac, lda, a, lda )
416 lwork = nmax*
max( 3, nrhs )
417 CALL cgetri( n, a, lda, iwork, work, lwork, info )
421 ainvnm = clange(
'1', n, n, a, lda, rwork )
422 IF( anormo.LE.zero .OR. ainvnm.LE.zero )
THEN
425 rcondo = ( one / anormo ) / ainvnm
430 ainvnm = clange(
'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 clacpy(
'Full', n, n, asav, lda, a, lda )
456 CALL clarhs( path, xtype,
'Full', trans, n, n, kl,
457 $ ku, nrhs, a, lda, xact, lda, b, lda,
460 CALL clacpy(
'Full', n, nrhs, b, lda, bsav, lda )
462 IF( nofact .AND. itran.EQ.1 )
THEN
469 CALL clacpy(
'Full', n, n, a, lda, afac, lda
470 CALL clacpy(
'Full', n, nrhs, b, lda, x, lda )
473 CALL cgesv( n, nrhs, afac, lda, iwork, x, lda,
479 $
CALL alaerh( path,
'CGESV ', info, izero,
480 $
' ', n, n, -1, -1, nrhs, imat,
481 $ nfail, nerrs, nout )
486 CALL cget01( n, n, a, lda, afac, lda, iwork,
487 $ rwork, result( 1 ) )
489 IF( izero.EQ.0 )
THEN
493 CALL clacpy( 'full
', N, NRHS, B, LDA, WORK,
495 CALL CGET02( 'no transpose
', N, N, NRHS, A,
496 $ LDA, X, LDA, WORK, LDA, RWORK,
501 CALL CGET04( 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 )'cgesv ', N,
514 $ IMAT, K, RESULT( K )
524 $ CALL CLASET( 'full
', N, N, CMPLX( ZERO ),
525 $ CMPLX( ZERO ), AFAC, LDA )
526 CALL CLASET( 'full
', N, NRHS, CMPLX( ZERO ),
527 $ CMPLX( ZERO ), X, LDA )
528.GT..AND..GT.
IF( IEQUED1 N0 ) THEN
533 CALL CLAQGE( N, N, A, LDA, S, S( N+1 ), ROWCND,
534 $ COLCND, AMAX, EQUED )
541 CALL CGESVX( FACT, TRANS, N, NRHS, A, LDA, AFAC,
542 $ LDA, IWORK, EQUED, S, S( N+1 ), B,
543 $ LDA, X, LDA, RCOND, RWORK,
544 $ RWORK( NRHS+1 ), WORK,
545 $ RWORK( 2*NRHS+1 ), INFO )
550 $ CALL ALAERH( PATH, 'cgesvx', INFO, IZERO,
551 $ FACT // TRANS, N, N, -1, -1, NRHS,
552 $ IMAT, NFAIL, NERRS, NOUT )
558 RPVGRW = CLANTR( 'm
', 'u
', 'n
', INFO, INFO,
560.EQ.
IF( RPVGRWZERO ) THEN
563 RPVGRW = CLANGE( 'm
', N, INFO, A, LDA,
567 RPVGRW = CLANTR( 'm
', 'u
', 'n
', N, N, AFAC, LDA,
569.EQ.
IF( RPVGRWZERO ) THEN
572 RPVGRW = CLANGE( 'm
', N, N, A, LDA, RDUM ) /
576 RESULT( 7 ) = ABS( RPVGRW-RWORK( 2*NRHS+1 ) ) /
577 $ MAX( RWORK( 2*NRHS+1 ), RPVGRW ) /
580.NOT.
IF( PREFAC ) THEN
585 CALL CGET01( N, N, A, LDA, AFAC, LDA, IWORK,
586 $ RWORK( 2*NRHS+1 ), RESULT( 1 ) )
597 CALL CLACPY( 'full
', N, NRHS, BSAV, LDA, WORK,
599 CALL CGET02( TRANS, N, N, NRHS, ASAV, LDA, X,
600 $ LDA, WORK, LDA, RWORK( 2*NRHS+1 ),
605.OR..AND.
IF( NOFACT ( PREFAC LSAME( EQUED,
607 CALL CGET04( N, NRHS, X, LDA, XACT, LDA,
608 $ RCONDC, RESULT( 3 ) )
610.EQ.
IF( ITRAN1 ) THEN
615 CALL CGET04( N, NRHS, X, LDA, XACT, LDA,
616 $ ROLDC, RESULT( 3 ) )
622 CALL CGET07( TRANS, N, NRHS, ASAV, LDA, B, LDA,
623 $ X, LDA, XACT, LDA, RWORK, .TRUE.,
624 $ RWORK( NRHS+1 ), RESULT( 4 ) )
632 RESULT( 6 ) = SGET06( RCOND, RCONDC )
637.NOT.
IF( TRFCON ) THEN
639.GE.
IF( RESULT( K )THRESH ) THEN
640.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
641 $ CALL ALADHD( NOUT, PATH )
643 WRITE( NOUT, FMT = 9997 )'cgesvx',
644 $ FACT, TRANS, N, EQUED, IMAT, K,
647 WRITE( NOUT, FMT = 9998 )'cgesvx',
648 $ FACT, TRANS, N, IMAT, K, RESULT( K )
655.GE..AND..NOT.
IF( RESULT( 1 )THRESH PREFAC )
657.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
658 $ CALL ALADHD( NOUT, PATH )
660 WRITE( NOUT, FMT = 9997 )'cgesvx', FACT,
661 $ TRANS, N, EQUED, IMAT, 1, RESULT( 1 )
663 WRITE( NOUT, FMT = 9998 )'cgesvx', FACT,
664 $ TRANS, N, IMAT, 1, RESULT( 1 )
669.GE.
IF( RESULT( 6 )THRESH ) THEN
670.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
671 $ CALL ALADHD( NOUT, PATH )
673 WRITE( NOUT, FMT = 9997 )'cgesvx', FACT,
674 $ TRANS, N, EQUED, IMAT, 6, RESULT( 6 )
676 WRITE( NOUT, FMT = 9998 )'cgesvx', FACT,
677 $ TRANS, N, IMAT, 6, RESULT( 6 )
682.GE.
IF( RESULT( 7 )THRESH ) THEN
683.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
684 $ CALL ALADHD( NOUT, PATH )
686 WRITE( NOUT, FMT = 9997 )'cgesvx', FACT,
687 $ TRANS, N, EQUED, IMAT, 7, RESULT( 7 )
689 WRITE( NOUT, FMT = 9998 )'cgesvx', FACT,
690 $ TRANS, N, IMAT, 7, RESULT( 7 )
703 CALL CLACPY( 'full
', N, N, ASAV, LDA, A, LDA )
704 CALL CLACPY( 'full
', N, NRHS, BSAV, LDA, B, LDA )
707 $ CALL CLASET( 'full
', N, N, CMPLX( ZERO ),
708 $ CMPLX( ZERO ), AFAC, LDA )
709 CALL CLASET( 'full
', N, NRHS, CMPLX( ZERO ),
710 $ CMPLX( ZERO ), X, LDA )
711.GT..AND..GT.
IF( IEQUED1 N0 ) THEN
716 CALL CLAQGE( N, N, A, LDA, S, S( N+1 ), ROWCND,
717 $ COLCND, AMAX, EQUED )
725 CALL CGESVXX( FACT, TRANS, N, NRHS, A, LDA, AFAC,
726 $ LDA, IWORK, EQUED, S, S( N+1 ), B, LDA, X,
727 $ LDA, RCOND, RPVGRW_SVXX, BERR, N_ERR_BNDS,
728 $ ERRBNDS_N, ERRBNDS_C, 0, ZERO, WORK,
733.EQ.
IF( INFON+1 ) GOTO 50
734.NE.
IF( INFOIZERO ) THEN
735 CALL ALAERH( PATH, 'cgesvxx', INFO, IZERO,
736 $ FACT // TRANS, N, N, -1, -1, NRHS,
737 $ IMAT, NFAIL, NERRS, NOUT )
745.GT..AND..LT.
IF ( INFO 0 INFO N+1 ) THEN
746 RPVGRW = CLA_GERPVGRW
747 $ (N, INFO, A, LDA, AFAC, LDA)
749 RPVGRW = CLA_GERPVGRW
750 $ (N, N, A, LDA, AFAC, LDA)
753 RESULT( 7 ) = ABS( RPVGRW-rpvgrw_svxx ) /
754 $ MAX( rpvgrw_svxx, RPVGRW ) /
757.NOT.
IF( PREFAC ) THEN
762 CALL CGET01( N, N, A, LDA, AFAC, LDA, IWORK,
763 $ RWORK( 2*NRHS+1 ), RESULT( 1 ) )
774 CALL CLACPY( 'full
', N, NRHS, BSAV, LDA, WORK,
776 CALL CGET02( TRANS, N, N, NRHS, ASAV, LDA, X,
777 $ LDA, WORK, LDA, RWORK( 2*NRHS+1 ),
782.OR..AND.
IF( NOFACT ( PREFAC LSAME( EQUED,
784 CALL CGET04( N, NRHS, X, LDA, XACT, LDA,
785 $ RCONDC, RESULT( 3 ) )
787.EQ.
IF( ITRAN1 ) THEN
792 CALL CGET04( N, NRHS, X, LDA, XACT, LDA,
793 $ ROLDC, RESULT( 3 ) )
802 RESULT( 6 ) = SGET06( RCOND, RCONDC )
807.NOT.
IF( TRFCON ) THEN
809.GE.
IF( RESULT( K )THRESH ) THEN
810.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
811 $ CALL ALADHD( NOUT, PATH )
813 WRITE( NOUT, FMT = 9997 )'cgesvxx',
814 $ FACT, TRANS, N, EQUED, IMAT, K,
817 WRITE( NOUT, FMT = 9998 )'cgesvxx',
818 $ FACT, TRANS, N, IMAT, K, RESULT( K )
825.GE..AND..NOT.
IF( RESULT( 1 )THRESH PREFAC )
827.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
828 $ CALL ALADHD( NOUT, PATH )
830 WRITE( NOUT, FMT = 9997 )'cgesvxx', FACT,
831 $ TRANS, N, EQUED, IMAT, 1, RESULT( 1 )
833 WRITE( NOUT, FMT = 9998 )'cgesvxx', FACT,
834 $ TRANS, N, IMAT, 1, RESULT( 1 )
839.GE.
IF( RESULT( 6 )THRESH ) THEN
840.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
841 $ CALL ALADHD( NOUT, PATH )
843 WRITE( NOUT, FMT = 9997 )'cgesvxx', FACT,
844 $ TRANS, N, EQUED, IMAT, 6, RESULT( 6 )
846 WRITE( NOUT, FMT = 9998 )'cgesvxx', FACT,
847 $ TRANS, N, IMAT, 6, RESULT( 6 )
852.GE.
IF( RESULT( 7 )THRESH ) THEN
853.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
854 $ CALL ALADHD( NOUT, PATH )
856 WRITE( NOUT, FMT = 9997 )'cgesvxx', FACT,
857 $ TRANS, N, EQUED, IMAT, 7, RESULT( 7 )
859 WRITE( NOUT, FMT = 9998 )'cgesvxx', FACT,
860 $ TRANS, N, IMAT, 7, RESULT( 7 )
876 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
881 CALL CEBCHVXX(THRESH, PATH)
883 9999 FORMAT( 1X, A, ', n =
', I5, ',
type ', I2, ', test(
', I2, ') =',
885 9998
FORMAT( 1x, a,
', FACT=''', a1,
''', TRANS=''', a1,
''', N=', i5,
886 $
', type ', i2,
', test(', i1,
')=', g12.5 )
887 9997
FORMAT( 1x, a,
', FACT=''', a1,
''', TRANS=''', a1,
''', N=', i5,
888 $
', EQUED=''', a1,
''', type ', i2,
', test(', i1,
')=',
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 claqge(m, n, a, lda, r, c, rowcnd, colcnd, amax, equed)
CLAQGE scales a general rectangular matrix, using row and column scaling factors computed by sgeequ.
subroutine cgetrf(m, n, a, lda, ipiv, info)
CGETRF
subroutine cgeequ(m, n, a, lda, r, c, rowcnd, colcnd, amax, info)
CGEEQU
subroutine cgetri(n, a, lda, ipiv, work, lwork, info)
CGETRI
subroutine cgesv(n, nrhs, a, lda, ipiv, b, ldb, info)
CGESV computes the solution to system of linear equations A * X = B for GE matrices (simple driver)
subroutine cgesvxx(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, rwork, info)
CGESVXX computes the solution to system of linear equations A * X = B for GE matrices
subroutine cgesvx(fact, trans, n, nrhs, a, lda, af, ldaf, ipiv, equed, r, c, b, ldb, x, ldx, rcond, ferr, berr, work, rwork, info)
CGESVX computes the solution to system of linear equations A * X = B for GE matrices
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
subroutine claset(uplo, m, n, alpha, beta, a, lda)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine clarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
CLARHS
subroutine cget02(trans, m, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
CGET02
subroutine cerrvx(path, nunit)
CERRVX
subroutine cget01(m, n, a, lda, afac, ldafac, ipiv, rwork, resid)
CGET01
subroutine cdrvge(dotype, nn, nval, nrhs, thresh, tsterr, nmax, a, afac, asav, b, bsav, x, xact, s, work, rwork, iwork, nout)
CDRVGE
subroutine clatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
CLATB4
subroutine cget07(trans, n, nrhs, a, lda, b, ldb, x, ldx, xact, ldxact, ferr, chkferr, berr, reslts)
CGET07
subroutine cget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
CGET04
subroutine clatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
CLATMS