3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE DCHKTR( DOTYPE, NN, NVAL, NNB, NBVAL, NNS, NSVAL,
12 * THRESH, TSTERR, NMAX, A, AINV, B, X, XACT,
13 * WORK, RWORK, IWORK, NOUT )
15 * .. Scalar Arguments ..
17 * INTEGER NMAX, NN, NNB, NNS, NOUT
18 * DOUBLE PRECISION THRESH
20 * .. Array Arguments ..
22 * INTEGER IWORK( * ), NBVAL( * ), NSVAL( * ), NVAL( * )
23 * DOUBLE PRECISION A( * ), AINV( * ), B( * ), RWORK( * ),
24 * $ WORK( * ), X( * ), XACT( * )
33 *> DCHKTR tests DTRTRI, -TRS, -RFS, and -CON, and DLATRS
41 *> DOTYPE is LOGICAL array, dimension (NTYPES)
42 *> The matrix types to be used for testing. Matrices of type j
43 *> (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) =
44 *> .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used.
50 *> The number of values of N contained in the vector NVAL.
55 *> NVAL is INTEGER array, dimension (NN)
56 *> The values of the matrix column dimension N.
62 *> The number of values of NB contained in the vector NBVAL.
67 *> NBVAL is INTEGER array, dimension (NNB)
68 *> The values of the blocksize NB.
74 *> The number of values of NRHS contained in the vector NSVAL.
79 *> NSVAL is INTEGER array, dimension (NNS)
80 *> The values of the number of right hand sides NRHS.
85 *> THRESH is DOUBLE PRECISION
86 *> The threshold value for the test ratios. A result is
87 *> included in the output file if RESULT >= THRESH. To have
88 *> every test ratio printed, use THRESH = 0.
94 *> Flag that indicates whether error exits are to be tested.
100 *> The leading dimension of the work arrays.
101 *> NMAX >= the maximum value of N in NVAL.
106 *> A is DOUBLE PRECISION array, dimension (NMAX*NMAX)
111 *> AINV is DOUBLE PRECISION array, dimension (NMAX*NMAX)
116 *> B is DOUBLE PRECISION array, dimension (NMAX*NSMAX)
117 *> where NSMAX is the largest entry in NSVAL.
122 *> X is DOUBLE PRECISION array, dimension (NMAX*NSMAX)
127 *> XACT is DOUBLE PRECISION array, dimension (NMAX*NSMAX)
132 *> WORK is DOUBLE PRECISION array, dimension
133 *> (NMAX*max(3,NSMAX))
138 *> RWORK is DOUBLE PRECISION array, dimension
139 *> (max(NMAX,2*NSMAX))
144 *> IWORK is INTEGER array, dimension (NMAX)
150 *> The unit number for output.
156 *> \author Univ. of Tennessee
157 *> \author Univ. of California Berkeley
158 *> \author Univ. of Colorado Denver
161 *> \date November 2011
163 *> \ingroup double_lin
165 * =====================================================================
166 SUBROUTINE DCHKTR( DOTYPE, NN, NVAL, NNB, NBVAL, NNS, NSVAL,
167 $ THRESH, TSTERR, NMAX, A, AINV, B, X, XACT,
168 $ WORK, RWORK, IWORK, NOUT )
170 * -- LAPACK test routine (version 3.4.0) --
171 * -- LAPACK is a software package provided by Univ. of Tennessee, --
172 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
175 * .. Scalar Arguments ..
177 INTEGER NMAX, NN, NNB, NNS, NOUT
178 DOUBLE PRECISION THRESH
180 * .. Array Arguments ..
182 INTEGER IWORK( * ), NBVAL( * ), NSVAL( * ), NVAL( * )
183 DOUBLE PRECISION A( * ), AINV( * ), B( * ), RWORK( * ),
184 $ WORK( * ), X( * ), XACT( * )
187 * =====================================================================
190 INTEGER NTYPE1, NTYPES
191 PARAMETER ( NTYPE1 = 10, NTYPES = 18 )
193 PARAMETER ( NTESTS = 9 )
195 PARAMETER ( NTRAN = 3 )
196 DOUBLE PRECISION ONE, ZERO
197 PARAMETER ( ONE = 1.0D0, ZERO = 0.0D0 )
199 * .. Local Scalars ..
200 CHARACTER DIAG, NORM, TRANS, UPLO, XTYPE
202 INTEGER I, IDIAG, IMAT, IN, INB, INFO, IRHS, ITRAN,
203 $ IUPLO, K, LDA, N, NB, NERRS, NFAIL, NRHS, NRUN
204 DOUBLE PRECISION AINVNM, ANORM, DUMMY, RCOND, RCONDC, RCONDI,
208 CHARACTER TRANSS( NTRAN ), UPLOS( 2 )
209 INTEGER ISEED( 4 ), ISEEDY( 4 )
210 DOUBLE PRECISION RESULT( NTESTS )
212 * .. External Functions ..
214 DOUBLE PRECISION DLANTR
215 EXTERNAL LSAME, DLANTR
217 * .. External Subroutines ..
218 EXTERNAL ALAERH, ALAHD, ALASUM, DCOPY, DERRTR, DGET04,
219 $ DLACPY, DLARHS, DLATRS, DLATTR, DTRCON, DTRRFS,
220 $ DTRT01, DTRT02, DTRT03, DTRT05, DTRT06, DTRTRI,
223 * .. Scalars in Common ..
226 INTEGER INFOT, IOUNIT
228 * .. Common blocks ..
229 COMMON / INFOC / INFOT, IOUNIT, OK, LERR
230 COMMON / SRNAMC / SRNAMT
232 * .. Intrinsic Functions ..
235 * .. Data statements ..
236 DATA ISEEDY / 1988, 1989, 1990, 1991 /
237 DATA UPLOS / 'U', 'L' / , TRANSS / 'N', 'T', 'C' /
239 * .. Executable Statements ..
241 * Initialize constants and the random number seed.
243 PATH( 1: 1 ) = 'Double precision'
249 ISEED( I ) = ISEEDY( I )
252 * Test the error exits
255 $ CALL DERRTR( PATH, NOUT )
261 * Do for each value of N in NVAL
267 DO 80 IMAT = 1, NTYPE1
269 * Do the tests only if DOTYPE( IMAT ) is true.
271 IF( .NOT.DOTYPE( IMAT ) )
276 * Do first for UPLO = 'U', then for UPLO = 'L'
278 UPLO = UPLOS( IUPLO )
280 * Call DLATTR to generate a triangular test matrix.
283 CALL DLATTR( IMAT, UPLO, 'No transpose', DIAG, ISEED, N,
284 $ A, LDA, X, WORK, INFO )
286 * Set IDIAG = 1 for non-unit matrices, 2 for unit.
288 IF( LSAME( DIAG, 'N' ) ) THEN
296 * Do for each blocksize in NBVAL
302 * Form the inverse of A.
304 CALL DLACPY( UPLO, N, N, A, LDA, AINV, LDA )
306 CALL DTRTRI( UPLO, DIAG, N, AINV, LDA, INFO )
308 * Check error code from DTRTRI.
311 $ CALL ALAERH( PATH, 'DTRTRI', INFO, 0, UPLO // DIAG,
312 $ N, N, -1, -1, NB, IMAT, NFAIL, NERRS,
315 * Compute the infinity-norm condition number of A.
317 ANORM = DLANTR( 'I', UPLO, DIAG, N, N, A, LDA, RWORK )
318 AINVNM = DLANTR( 'I', UPLO, DIAG, N, N, AINV, LDA,
320 IF( ANORM.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
323 RCONDI = ( ONE / ANORM ) / AINVNM
326 * Compute the residual for the triangular matrix times
327 * its inverse. Also compute the 1-norm condition number
330 CALL DTRT01( UPLO, DIAG, N, A, LDA, AINV, LDA, RCONDO,
331 $ RWORK, RESULT( 1 ) )
333 * Print the test ratio if it is .GE. THRESH.
335 IF( RESULT( 1 ).GE.THRESH ) THEN
336 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
337 $ CALL ALAHD( NOUT, PATH )
338 WRITE( NOUT, FMT = 9999 )UPLO, DIAG, N, NB, IMAT,
344 * Skip remaining tests if not the first block size.
353 DO 30 ITRAN = 1, NTRAN
355 * Do for op(A) = A, A**T, or A**H.
357 TRANS = TRANSS( ITRAN )
358 IF( ITRAN.EQ.1 ) THEN
367 * Solve and compute residual for op(A)*x = b.
370 CALL DLARHS( PATH, XTYPE, UPLO, TRANS, N, N, 0,
371 $ IDIAG, NRHS, A, LDA, XACT, LDA, B,
374 CALL DLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
377 CALL DTRTRS( UPLO, TRANS, DIAG, N, NRHS, A, LDA,
380 * Check error code from DTRTRS.
383 $ CALL ALAERH( PATH, 'DTRTRS', INFO, 0,
384 $ UPLO // TRANS // DIAG, N, N, -1,
385 $ -1, NRHS, IMAT, NFAIL, NERRS,
388 * This line is needed on a Sun SPARCstation.
393 CALL DTRT02( UPLO, TRANS, DIAG, N, NRHS, A, LDA,
394 $ X, LDA, B, LDA, WORK, RESULT( 2 ) )
397 * Check solution from generated exact solution.
399 CALL DGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
403 * Use iterative refinement to improve the solution
404 * and compute error bounds.
407 CALL DTRRFS( UPLO, TRANS, DIAG, N, NRHS, A, LDA,
408 $ B, LDA, X, LDA, RWORK,
409 $ RWORK( NRHS+1 ), WORK, IWORK,
412 * Check error code from DTRRFS.
415 $ CALL ALAERH( PATH, 'DTRRFS', INFO, 0,
416 $ UPLO // TRANS // DIAG, N, N, -1,
417 $ -1, NRHS, IMAT, NFAIL, NERRS,
420 CALL DGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
422 CALL DTRT05( UPLO, TRANS, DIAG, N, NRHS, A, LDA,
423 $ B, LDA, X, LDA, XACT, LDA, RWORK,
424 $ RWORK( NRHS+1 ), RESULT( 5 ) )
426 * Print information about the tests that did not
427 * pass the threshold.
430 IF( RESULT( K ).GE.THRESH ) THEN
431 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
432 $ CALL ALAHD( NOUT, PATH )
433 WRITE( NOUT, FMT = 9998 )UPLO, TRANS,
434 $ DIAG, N, NRHS, IMAT, K, RESULT( K )
443 * Get an estimate of RCOND = 1/CNDNUM.
446 IF( ITRAN.EQ.1 ) THEN
454 CALL DTRCON( NORM, UPLO, DIAG, N, A, LDA, RCOND,
455 $ WORK, IWORK, INFO )
457 * Check error code from DTRCON.
460 $ CALL ALAERH( PATH, 'DTRCON', INFO, 0,
461 $ NORM // UPLO // DIAG, N, N, -1, -1,
462 $ -1, IMAT, NFAIL, NERRS, NOUT )
464 CALL DTRT06( RCOND, RCONDC, UPLO, DIAG, N, A, LDA,
465 $ RWORK, RESULT( 7 ) )
467 * Print the test ratio if it is .GE. THRESH.
469 IF( RESULT( 7 ).GE.THRESH ) THEN
470 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
471 $ CALL ALAHD( NOUT, PATH )
472 WRITE( NOUT, FMT = 9997 )NORM, UPLO, N, IMAT,
482 * Use pathological test matrices to test DLATRS.
484 DO 110 IMAT = NTYPE1 + 1, NTYPES
486 * Do the tests only if DOTYPE( IMAT ) is true.
488 IF( .NOT.DOTYPE( IMAT ) )
493 * Do first for UPLO = 'U', then for UPLO = 'L'
495 UPLO = UPLOS( IUPLO )
496 DO 90 ITRAN = 1, NTRAN
498 * Do for op(A) = A, A**T, and A**H.
500 TRANS = TRANSS( ITRAN )
502 * Call DLATTR to generate a triangular test matrix.
505 CALL DLATTR( IMAT, UPLO, TRANS, DIAG, ISEED, N, A,
506 $ LDA, X, WORK, INFO )
509 * Solve the system op(A)*x = b.
512 CALL DCOPY( N, X, 1, B, 1 )
513 CALL DLATRS( UPLO, TRANS, DIAG, 'N', N, A, LDA, B,
514 $ SCALE, RWORK, INFO )
516 * Check error code from DLATRS.
519 $ CALL ALAERH( PATH, 'DLATRS', INFO, 0,
520 $ UPLO // TRANS // DIAG // 'N', N, N,
521 $ -1, -1, -1, IMAT, NFAIL, NERRS, NOUT )
523 CALL DTRT03( UPLO, TRANS, DIAG, N, 1, A, LDA, SCALE,
524 $ RWORK, ONE, B, LDA, X, LDA, WORK,
528 * Solve op(A)*X = b again with NORMIN = 'Y'.
530 CALL DCOPY( N, X, 1, B( N+1 ), 1 )
531 CALL DLATRS( UPLO, TRANS, DIAG, 'Y', N, A, LDA,
532 $ B( N+1 ), SCALE, RWORK, INFO )
534 * Check error code from DLATRS.
537 $ CALL ALAERH( PATH, 'DLATRS', INFO, 0,
538 $ UPLO // TRANS // DIAG // 'Y', N, N,
539 $ -1, -1, -1, IMAT, NFAIL, NERRS, NOUT )
541 CALL DTRT03( UPLO, TRANS, DIAG, N, 1, A, LDA, SCALE,
542 $ RWORK, ONE, B( N+1 ), LDA, X, LDA, WORK,
545 * Print information about the tests that did not pass
548 IF( RESULT( 8 ).GE.THRESH ) THEN
549 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
550 $ CALL ALAHD( NOUT, PATH )
551 WRITE( NOUT, FMT = 9996 )'DLATRS', UPLO, TRANS,
552 $ DIAG, 'N', N, IMAT, 8, RESULT( 8 )
555 IF( RESULT( 9 ).GE.THRESH ) THEN
556 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
557 $ CALL ALAHD( NOUT, PATH )
558 WRITE( NOUT, FMT = 9996 )'DLATRS', UPLO, TRANS,
559 $ DIAG, 'Y', N, IMAT, 9, RESULT( 9 )
568 * Print a summary of the results.
570 CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS )
572 9999 FORMAT( ' UPLO=''', A1, ''', DIAG=''', A1, ''', N=', I5, ', NB=',
573 $ I4, ', type ', I2, ', test(', I2, ')= ', G12.5 )
574 9998 FORMAT( ' UPLO=''', A1, ''', TRANS=''', A1, ''', DIAG=''', A1,
575 $ ''', N=', I5, ', NB=', I4, ', type ', I2, ',
576 $ test(', I2, ')= ', G12.5 )
577 9997 FORMAT( ' NORM=''', A1, ''', UPLO =''', A1, ''', N=', I5, ',',
578 $ 11X, ' type ', I2, ', test(', I2, ')=', G12.5 )
579 9996 FORMAT( 1X, A, '( ''', A1, ''', ''', A1, ''', ''', A1, ''', ''',
580 $ A1, ''',', I5, ', ... ), type ', I2, ', test(', I2, ')=',