153 SUBROUTINE ddrvsy( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, NMAX,
154 $ A, AFAC, AINV, B, X, XACT, WORK, RWORK, IWORK,
163 INTEGER NMAX, NN, NOUT, NRHS
164 DOUBLE PRECISION THRESH
168 INTEGER IWORK( * ), NVAL( * )
169 DOUBLE PRECISION A( * ), AFAC( * ), AINV( * ), B( * ),
170 $ rwork( * ), work( * ), x( * ), xact( * )
176 DOUBLE PRECISION ONE, ZERO
177 PARAMETER ( ONE = 1.0d+0, zero = 0.0d+0 )
178 INTEGER NTYPES, NTESTS
179 parameter( ntypes = 10, ntests = 6 )
181 parameter( nfact = 2 )
185 CHARACTER DIST, EQUED, FACT,
TYPE, UPLO, XTYPE
187 INTEGER I, I1, I2, IFACT, IMAT, IN, INFO, IOFF, IUPLO,
188 $ izero, j, k, k1, kl, ku, lda, lwork, mode, n,
189 $ nb, nbmin, nerrs, nfail, nimat, nrun, nt,
191 DOUBLE PRECISION AINVNM, ANORM, CNDNUM, RCOND, RCONDC,
195 CHARACTER FACTS( NFACT ), UPLOS( 2 )
196 INTEGER ISEED( 4 ), ISEEDY( 4 )
197 DOUBLE PRECISION RESULT( NTESTS ), BERR( NRHS ),
198 $ errbnds_n( nrhs, 3 ), errbnds_c( nrhs, 3 )
201 DOUBLE PRECISION DGET06, DLANSY
202 EXTERNAL DGET06, DLANSY
216 COMMON / infoc / infot, nunit, ok, lerr
217 COMMON / srnamc / srnamt
223 DATA iseedy / 1988, 1989, 1990, 1991 /
224 DATA uplos /
'U',
'L' / , facts /
'F',
'N' /
230 path( 1: 1 ) =
'Double precision'
236 iseed( i ) = iseedy( i )
238 lwork = max( 2*nmax, nmax*nrhs )
243 $
CALL derrvx( path, nout )
263 DO 170 imat = 1, nimat
267 IF( .NOT.dotype( imat ) )
272 zerot = imat.GE.3 .AND. imat.LE.6
273 IF( zerot .AND. n.LT.imat-2 )
279 uplo = uplos( iuplo )
284 CALL dlatb4( path, imat, n, n,
TYPE, kl, ku, anorm, mode,
288 CALL dlatms( n, n, dist, iseed,
TYPE, rwork, mode,
289 $ cndnum, anorm, kl, ku, uplo, a, lda, work,
295 CALL alaerh( path,
'DLATMS', info, 0, uplo, n, n, -1,
296 $ -1, -1, imat, nfail, nerrs, nout )
306 ELSE IF( imat.EQ.4 )
THEN
316 IF( iuplo.EQ.1 )
THEN
317 ioff = ( izero-1 )*lda
318 DO 20 i = 1, izero - 1
328 DO 40 i = 1, izero - 1
339 IF( iuplo.EQ.1 )
THEN
367 DO 150 ifact = 1, nfact
371 fact = facts( ifact )
381 ELSE IF( ifact.EQ.1 )
THEN
385 anorm = dlansy(
'1', uplo, n, a, lda, rwork )
389 CALL dlacpy( uplo, n, n, a, lda, afac, lda )
390 CALL dsytrf( uplo, n, afac, lda, iwork, work,
395 CALL dlacpy( uplo, n, n, afac, lda, ainv, lda )
396 lwork = (n+nb+1)*(nb+3)
397 CALL dsytri2( uplo, n, ainv, lda, iwork, work,
399 ainvnm = dlansy(
'1', uplo, n, ainv, lda, rwork )
403 IF( anorm.LE.zero .OR. ainvnm.LE.zero )
THEN
406 rcondc = ( one / anorm ) / ainvnm
413 CALL dlarhs( path, xtype, uplo,
' ', n, n, kl, ku,
414 $ nrhs, a, lda, xact, lda, b, lda, iseed,
420 IF( ifact.EQ.2 )
THEN
421 CALL dlacpy( uplo, n, n, a, lda, afac, lda )
422 CALL dlacpy(
'Full', n, nrhs, b, lda, x, lda )
427 CALL dsysv( uplo, n, nrhs, afac, lda, iwork, x,
428 $ lda, work, lwork, info )
436 IF( iwork( k ).LT.0 )
THEN
437 IF( iwork( k ).NE.-k )
THEN
441 ELSE IF( iwork( k ).NE.k )
THEN
450 CALL alaerh( path,
'DSYSV ', info, k, uplo, n,
451 $ n, -1, -1, nrhs, imat, nfail,
454 ELSE IF( info.NE.0 )
THEN
461 CALL dsyt01( uplo, n, a, lda, afac, lda, iwork,
462 $ ainv, lda, rwork, result( 1 ) )
466 CALL dlacpy(
'Full', n, nrhs, b, lda, work, lda )
467 CALL dpot02( uplo, n, nrhs, a, lda, x, lda, work,
468 $ lda, rwork, result( 2 ) )
472 CALL dget04( n, nrhs, x, lda, xact, lda, rcondc,
480 IF( result( k ).GE.thresh )
THEN
481 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
482 $
CALL aladhd( nout, path )
483 WRITE( nout, fmt = 9999 )
'DSYSV ', uplo, n,
484 $ imat, k, result( k )
495 $
CALL dlaset( uplo, n, n, zero, zero, afac, lda )
496 CALL dlaset(
'Full', n, nrhs, zero, zero, x, lda )
502 CALL dsysvx( fact, uplo, n, nrhs, a, lda, afac, lda,
503 $ iwork, b, lda, x, lda, rcond, rwork,
504 $ rwork( nrhs+1 ), work, lwork,
505 $ iwork( n+1 ), info )
513 IF( iwork( k ).LT.0 )
THEN
514 IF( iwork( k ).NE.-k )
THEN
518 ELSE IF( iwork( k ).NE.k )
THEN
527 CALL alaerh( path,
'DSYSVX', info, k, fact // uplo,
528 $ n, n, -1, -1, nrhs, imat, nfail,
534 IF( ifact.GE.2 )
THEN
539 CALL dsyt01( uplo, n, a, lda, afac, lda, iwork,
540 $ ainv, lda, rwork( 2*nrhs+1 ),
549 CALL dlacpy(
'Full', n, nrhs, b, lda, work, lda )
550 CALL dpot02( uplo, n, nrhs, a, lda, x, lda, work,
551 $ lda, rwork( 2*nrhs+1 ), result( 2 ) )
555 CALL dget04( n, nrhs, x, lda, xact, lda, rcondc,
560 CALL dpot05( uplo, n, nrhs, a, lda, b, lda, x, lda,
561 $ xact, lda, rwork, rwork( nrhs+1 ),
570 result( 6 ) = dget06( rcond, rcondc )
576 IF( result( k ).GE.thresh )
THEN
577 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
578 $
CALL aladhd( nout, path )
579 WRITE( nout, fmt = 9998 )
'DSYSVX', fact, uplo,
580 $ n, imat, k, result( k )
591 $
CALL dlaset( uplo, n, n, zero, zero, afac, lda )
592 CALL dlaset(
'Full', n, nrhs, zero, zero, x, lda )
600 CALL dsysvxx( fact, uplo, n, nrhs, a, lda, afac,
601 $ lda, iwork, equed, work( n+1 ), b, lda, x,
602 $ lda, rcond, rpvgrw_svxx, berr, n_err_bnds,
603 $ errbnds_n, errbnds_c, 0, zero, work,
604 $ iwork( n+1 ), info )
612 IF( iwork( k ).LT.0 )
THEN
613 IF( iwork( k ).NE.-k )
THEN
617 ELSE IF( iwork( k ).NE.k )
THEN
625 IF( info.NE.k .AND. info.LE.n )
THEN
626 CALL alaerh( path,
'DSYSVXX', info, k,
627 $ fact // uplo, n, n, -1, -1, nrhs, imat, nfail,
633 IF( ifact.GE.2 )
THEN
638 CALL dsyt01( uplo, n, a, lda, afac, lda, iwork,
639 $ ainv, lda, rwork(2*nrhs+1),
648 CALL dlacpy(
'Full', n, nrhs, b, lda, work, lda )
649 CALL dpot02( uplo, n, nrhs, a, lda, x, lda, work,
650 $ lda, rwork( 2*nrhs+1 ), result( 2 ) )
654 CALL dget04( n, nrhs, x, lda, xact, lda, rcondc,
659 CALL dpot05( uplo, n, nrhs, a, lda, b, lda, x, lda,
660 $ xact, lda, rwork, rwork( nrhs+1 ),
669 result( 6 ) = dget06( rcond, rcondc )
675 IF( result( k ).GE.thresh )
THEN
676 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
677 $
CALL aladhd( nout, path )
678 WRITE( nout, fmt = 9998 )
'DSYSVXX',
679 $ fact, uplo, n, imat, k,
694 CALL alasvm( path, nout, nfail, nrun, nerrs )
701 9999
FORMAT( 1x, a,
', UPLO=''', a1,
''', N =', i5,
', type ', i2,
702 $
', test ', i2,
', ratio =', g12.5 )
703 9998
FORMAT( 1x, a,
', FACT=''', a1,
''', UPLO=''', a1,
''', N =', i5,
704 $
', type ', i2,
', test ', i2,
', ratio =', g12.5 )
subroutine alasvm(type, nout, nfail, nrun, nerrs)
ALASVM
subroutine dlarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
DLARHS
subroutine xlaenv(ispec, nvalue)
XLAENV
subroutine aladhd(iounit, path)
ALADHD
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine ddrvsy(dotype, nn, nval, nrhs, thresh, tsterr, nmax, a, afac, ainv, b, x, xact, work, rwork, iwork, nout)
DDRVSY
subroutine debchvxx(thresh, path)
DEBCHVXX
subroutine derrvx(path, nunit)
DERRVX
subroutine dget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
DGET04
subroutine dlatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
DLATB4
subroutine dlatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
DLATMS
subroutine dpot02(uplo, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
DPOT02
subroutine dpot05(uplo, n, nrhs, a, lda, b, ldb, x, ldx, xact, ldxact, ferr, berr, reslts)
DPOT05
subroutine dsyt01(uplo, n, a, lda, afac, ldafac, ipiv, c, ldc, rwork, resid)
DSYT01
subroutine dsysv(uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info)
DSYSV computes the solution to system of linear equations A * X = B for SY matrices
subroutine dsysvx(fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x, ldx, rcond, ferr, berr, work, lwork, iwork, info)
DSYSVX computes the solution to system of linear equations A * X = B for SY matrices
subroutine dsysvxx(fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, equed, s, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, iwork, info)
DSYSVXX
subroutine dsytrf(uplo, n, a, lda, ipiv, work, lwork, info)
DSYTRF
subroutine dsytri2(uplo, n, a, lda, ipiv, work, lwork, info)
DSYTRI2
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.