3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE DCHKGE( DOTYPE, NM, MVAL, NN, NVAL, NNB, NBVAL, NNS,
12 * NSVAL, THRESH, TSTERR, NMAX, A, AFAC, AINV, B,
13 * X, XACT, WORK, RWORK, IWORK, NOUT )
15 * .. Scalar Arguments ..
17 * INTEGER NM, NMAX, NN, NNB, NNS, NOUT
18 * DOUBLE PRECISION THRESH
20 * .. Array Arguments ..
22 * INTEGER IWORK( * ), MVAL( * ), NBVAL( * ), NSVAL( * ),
24 * DOUBLE PRECISION A( * ), AFAC( * ), AINV( * ), B( * ),
25 * $ RWORK( * ), WORK( * ), X( * ), XACT( * )
34 *> DCHKGE tests DGETRF, -TRI, -TRS, -RFS, and -CON.
42 *> DOTYPE is LOGICAL array, dimension (NTYPES)
43 *> The matrix types to be used for testing. Matrices of type j
44 *> (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) =
45 *> .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used.
51 *> The number of values of M contained in the vector MVAL.
56 *> MVAL is INTEGER array, dimension (NM)
57 *> The values of the matrix row dimension M.
63 *> The number of values of N contained in the vector NVAL.
68 *> NVAL is INTEGER array, dimension (NN)
69 *> The values of the matrix column dimension N.
75 *> The number of values of NB contained in the vector NBVAL.
80 *> NBVAL is INTEGER array, dimension (NBVAL)
81 *> The values of the blocksize NB.
87 *> The number of values of NRHS contained in the vector NSVAL.
92 *> NSVAL is INTEGER array, dimension (NNS)
93 *> The values of the number of right hand sides NRHS.
98 *> THRESH is DOUBLE PRECISION
99 *> The threshold value for the test ratios. A result is
100 *> included in the output file if RESULT >= THRESH. To have
101 *> every test ratio printed, use THRESH = 0.
107 *> Flag that indicates whether error exits are to be tested.
113 *> The maximum value permitted for M or N, used in dimensioning
119 *> A is DOUBLE PRECISION array, dimension (NMAX*NMAX)
124 *> AFAC is DOUBLE PRECISION array, dimension (NMAX*NMAX)
129 *> AINV is DOUBLE PRECISION array, dimension (NMAX*NMAX)
134 *> B is DOUBLE PRECISION array, dimension (NMAX*NSMAX)
135 *> where NSMAX is the largest entry in NSVAL.
140 *> X is DOUBLE PRECISION array, dimension (NMAX*NSMAX)
145 *> XACT is DOUBLE PRECISION array, dimension (NMAX*NSMAX)
150 *> WORK is DOUBLE PRECISION array, dimension
151 *> (NMAX*max(3,NSMAX))
156 *> RWORK is DOUBLE PRECISION array, dimension
157 *> (max(2*NMAX,2*NSMAX+NWORK))
162 *> IWORK is INTEGER array, dimension (2*NMAX)
168 *> The unit number for output.
174 *> \author Univ. of Tennessee
175 *> \author Univ. of California Berkeley
176 *> \author Univ. of Colorado Denver
179 *> \date November 2011
181 *> \ingroup double_lin
183 * =====================================================================
184 SUBROUTINE DCHKGE( DOTYPE, NM, MVAL, NN, NVAL, NNB, NBVAL, NNS,
185 $ NSVAL, THRESH, TSTERR, NMAX, A, AFAC, AINV, B,
186 $ X, XACT, WORK, RWORK, IWORK, NOUT )
188 * -- LAPACK test routine (version 3.4.0) --
189 * -- LAPACK is a software package provided by Univ. of Tennessee, --
190 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
193 * .. Scalar Arguments ..
195 INTEGER NM, NMAX, NN, NNB, NNS, NOUT
196 DOUBLE PRECISION THRESH
198 * .. Array Arguments ..
200 INTEGER IWORK( * ), MVAL( * ), NBVAL( * ), NSVAL( * ),
202 DOUBLE PRECISION A( * ), AFAC( * ), AINV( * ), B( * ),
203 $ RWORK( * ), WORK( * ), X( * ), XACT( * )
206 * =====================================================================
209 DOUBLE PRECISION ONE, ZERO
210 PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
212 PARAMETER ( NTYPES = 11 )
214 PARAMETER ( NTESTS = 8 )
216 PARAMETER ( NTRAN = 3 )
218 * .. Local Scalars ..
219 LOGICAL TRFCON, ZEROT
220 CHARACTER DIST, NORM, TRANS, TYPE, XTYPE
222 INTEGER I, IM, IMAT, IN, INB, INFO, IOFF, IRHS, ITRAN,
223 $ IZERO, K, KL, KU, LDA, LWORK, M, MODE, N, NB,
224 $ NERRS, NFAIL, NIMAT, NRHS, NRUN, NT
225 DOUBLE PRECISION AINVNM, ANORM, ANORMI, ANORMO, CNDNUM, DUMMY,
226 $ RCOND, RCONDC, RCONDI, RCONDO
229 CHARACTER TRANSS( NTRAN )
230 INTEGER ISEED( 4 ), ISEEDY( 4 )
231 DOUBLE PRECISION RESULT( NTESTS )
233 * .. External Functions ..
234 DOUBLE PRECISION DGET06, DLANGE
235 EXTERNAL DGET06, DLANGE
237 * .. External Subroutines ..
238 EXTERNAL ALAERH, ALAHD, ALASUM, DERRGE, DGECON, DGERFS,
239 $ DGET01, DGET02, DGET03, DGET04, DGET07, DGETRF,
240 $ DGETRI, DGETRS, DLACPY, DLARHS, DLASET, DLATB4,
243 * .. Intrinsic Functions ..
246 * .. Scalars in Common ..
251 * .. Common blocks ..
252 COMMON / INFOC / INFOT, NUNIT, OK, LERR
253 COMMON / SRNAMC / SRNAMT
255 * .. Data statements ..
256 DATA ISEEDY / 1988, 1989, 1990, 1991 / ,
257 $ TRANSS / 'N', 'T', 'C' /
259 * .. Executable Statements ..
261 * Initialize constants and the random number seed.
263 PATH( 1: 1 ) = 'Double precision'
269 ISEED( I ) = ISEEDY( I )
272 * Test the error exits
276 $ CALL DERRGE( PATH, NOUT )
280 * Do for each value of M in MVAL
286 * Do for each value of N in NVAL
292 IF( M.LE.0 .OR. N.LE.0 )
295 DO 100 IMAT = 1, NIMAT
297 * Do the tests only if DOTYPE( IMAT ) is true.
299 IF( .NOT.DOTYPE( IMAT ) )
302 * Skip types 5, 6, or 7 if the matrix size is too small.
304 ZEROT = IMAT.GE.5 .AND. IMAT.LE.7
305 IF( ZEROT .AND. N.LT.IMAT-4 )
308 * Set up parameters with DLATB4 and generate a test matrix
311 CALL DLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE,
315 CALL DLATMS( M, N, DIST, ISEED, TYPE, RWORK, MODE,
316 $ CNDNUM, ANORM, KL, KU, 'No packing', A, LDA,
319 * Check error code from DLATMS.
322 CALL ALAERH( PATH, 'DLATMS', INFO, 0, ' ', M, N, -1,
323 $ -1, -1, IMAT, NFAIL, NERRS, NOUT )
327 * For types 5-7, zero one or more columns of the matrix to
328 * test that INFO is returned correctly.
333 ELSE IF( IMAT.EQ.6 ) THEN
336 IZERO = MIN( M, N ) / 2 + 1
338 IOFF = ( IZERO-1 )*LDA
344 CALL DLASET( 'Full', M, N-IZERO+1, ZERO, ZERO,
351 * These lines, if used in place of the calls in the DO 60
352 * loop, cause the code to bomb on a Sun SPARCstation.
354 * ANORMO = DLANGE( 'O', M, N, A, LDA, RWORK )
355 * ANORMI = DLANGE( 'I', M, N, A, LDA, RWORK )
357 * Do for each blocksize in NBVAL
363 * Compute the LU factorization of the matrix.
365 CALL DLACPY( 'Full', M, N, A, LDA, AFAC, LDA )
367 CALL DGETRF( M, N, AFAC, LDA, IWORK, INFO )
369 * Check error code from DGETRF.
372 $ CALL ALAERH( PATH, 'DGETRF', INFO, IZERO, ' ', M,
373 $ N, -1, -1, NB, IMAT, NFAIL, NERRS,
378 * Reconstruct matrix from factors and compute residual.
380 CALL DLACPY( 'Full', M, N, AFAC, LDA, AINV, LDA )
381 CALL DGET01( M, N, A, LDA, AINV, LDA, IWORK, RWORK,
386 * Form the inverse if the factorization was successful
387 * and compute the residual.
389 IF( M.EQ.N .AND. INFO.EQ.0 ) THEN
390 CALL DLACPY( 'Full', N, N, AFAC, LDA, AINV, LDA )
393 LWORK = NMAX*MAX( 3, NRHS )
394 CALL DGETRI( N, AINV, LDA, IWORK, WORK, LWORK,
397 * Check error code from DGETRI.
400 $ CALL ALAERH( PATH, 'DGETRI', INFO, 0, ' ', N, N,
401 $ -1, -1, NB, IMAT, NFAIL, NERRS,
404 * Compute the residual for the matrix times its
405 * inverse. Also compute the 1-norm condition number
408 CALL DGET03( N, A, LDA, AINV, LDA, WORK, LDA,
409 $ RWORK, RCONDO, RESULT( 2 ) )
410 ANORMO = DLANGE( 'O', M, N, A, LDA, RWORK )
412 * Compute the infinity-norm condition number of A.
414 ANORMI = DLANGE( 'I', M, N, A, LDA, RWORK )
415 AINVNM = DLANGE( 'I', N, N, AINV, LDA, RWORK )
416 IF( ANORMI.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
419 RCONDI = ( ONE / ANORMI ) / AINVNM
424 * Do only the condition estimate if INFO > 0.
427 ANORMO = DLANGE( 'O', M, N, A, LDA, RWORK )
428 ANORMI = DLANGE( 'I', M, N, A, LDA, RWORK )
433 * Print information about the tests so far that did not
434 * pass the threshold.
437 IF( RESULT( K ).GE.THRESH ) THEN
438 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
439 $ CALL ALAHD( NOUT, PATH )
440 WRITE( NOUT, FMT = 9999 )M, N, NB, IMAT, K,
447 * Skip the remaining tests if this is not the first
448 * block size or if M .ne. N. Skip the solve tests if
449 * the matrix is singular.
451 IF( INB.GT.1 .OR. M.NE.N )
460 DO 50 ITRAN = 1, NTRAN
461 TRANS = TRANSS( ITRAN )
462 IF( ITRAN.EQ.1 ) THEN
469 * Solve and compute residual for A * X = B.
472 CALL DLARHS( PATH, XTYPE, ' ', TRANS, N, N, KL,
473 $ KU, NRHS, A, LDA, XACT, LDA, B,
477 CALL DLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
479 CALL DGETRS( TRANS, N, NRHS, AFAC, LDA, IWORK,
482 * Check error code from DGETRS.
485 $ CALL ALAERH( PATH, 'DGETRS', INFO, 0, TRANS,
486 $ N, N, -1, -1, NRHS, IMAT, NFAIL,
489 CALL DLACPY( 'Full', N, NRHS, B, LDA, WORK,
491 CALL DGET02( TRANS, N, N, NRHS, A, LDA, X, LDA,
492 $ WORK, LDA, RWORK, RESULT( 3 ) )
495 * Check solution from generated exact solution.
497 CALL DGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
501 * Use iterative refinement to improve the
505 CALL DGERFS( TRANS, N, NRHS, A, LDA, AFAC, LDA,
506 $ IWORK, B, LDA, X, LDA, RWORK,
507 $ RWORK( NRHS+1 ), WORK,
508 $ IWORK( N+1 ), INFO )
510 * Check error code from DGERFS.
513 $ CALL ALAERH( PATH, 'DGERFS', INFO, 0, TRANS,
514 $ N, N, -1, -1, NRHS, IMAT, NFAIL,
517 CALL DGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
519 CALL DGET07( TRANS, N, NRHS, A, LDA, B, LDA, X,
520 $ LDA, XACT, LDA, RWORK, .TRUE.,
521 $ RWORK( NRHS+1 ), RESULT( 6 ) )
523 * Print information about the tests that did not
524 * pass the threshold.
527 IF( RESULT( K ).GE.THRESH ) THEN
528 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
529 $ CALL ALAHD( NOUT, PATH )
530 WRITE( NOUT, FMT = 9998 )TRANS, N, NRHS,
531 $ IMAT, K, RESULT( K )
540 * Get an estimate of RCOND = 1/CNDNUM.
544 IF( ITRAN.EQ.1 ) THEN
554 CALL DGECON( NORM, N, AFAC, LDA, ANORM, RCOND,
555 $ WORK, IWORK( N+1 ), INFO )
557 * Check error code from DGECON.
560 $ CALL ALAERH( PATH, 'DGECON', INFO, 0, NORM, N,
561 $ N, -1, -1, -1, IMAT, NFAIL, NERRS,
564 * This line is needed on a Sun SPARCstation.
568 RESULT( 8 ) = DGET06( RCOND, RCONDC )
570 * Print information about the tests that did not pass
573 IF( RESULT( 8 ).GE.THRESH ) THEN
574 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
575 $ CALL ALAHD( NOUT, PATH )
576 WRITE( NOUT, FMT = 9997 )NORM, N, IMAT, 8,
587 * Print a summary of the results.
589 CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS )
591 9999 FORMAT( ' M = ', I5, ', N =', I5, ', NB =', I4, ', type ', I2,
592 $ ', test(', I2, ') =', G12.5 )
593 9998 FORMAT( ' TRANS=''', A1, ''', N =', I5, ', NRHS=', I3, ', type ',
594 $ I2, ', test(', I2, ') =', G12.5 )
595 9997 FORMAT( ' NORM =''', A1, ''', N =', I5, ',', 10X, ' type ', I2,
596 $ ', test(', I2, ') =', G12.5 )