3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE ZCHKGT( DOTYPE, NN, NVAL, NNS, NSVAL, THRESH, TSTERR,
12 * A, AF, B, X, XACT, WORK, RWORK, IWORK, NOUT )
14 * .. Scalar Arguments ..
16 * INTEGER NN, NNS, NOUT
17 * DOUBLE PRECISION THRESH
19 * .. Array Arguments ..
21 * INTEGER IWORK( * ), NSVAL( * ), NVAL( * )
22 * DOUBLE PRECISION RWORK( * )
23 * COMPLEX*16 A( * ), AF( * ), B( * ), WORK( * ), X( * ),
33 *> ZCHKGT tests ZGTTRF, -TRS, -RFS, and -CON
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 dimension N.
62 *> The number of values of NRHS contained in the vector NSVAL.
67 *> NSVAL is INTEGER array, dimension (NNS)
68 *> The values of the number of right hand sides NRHS.
73 *> THRESH is DOUBLE PRECISION
74 *> The threshold value for the test ratios. A result is
75 *> included in the output file if RESULT >= THRESH. To have
76 *> every test ratio printed, use THRESH = 0.
82 *> Flag that indicates whether error exits are to be tested.
87 *> A is COMPLEX*16 array, dimension (NMAX*4)
92 *> AF is COMPLEX*16 array, dimension (NMAX*4)
97 *> B is COMPLEX*16 array, dimension (NMAX*NSMAX)
98 *> where NSMAX is the largest entry in NSVAL.
103 *> X is COMPLEX*16 array, dimension (NMAX*NSMAX)
108 *> XACT is COMPLEX*16 array, dimension (NMAX*NSMAX)
113 *> WORK is COMPLEX*16 array, dimension
114 *> (NMAX*max(3,NSMAX))
119 *> RWORK is DOUBLE PRECISION array, dimension
120 *> (max(NMAX)+2*NSMAX)
125 *> IWORK is INTEGER array, dimension (NMAX)
131 *> The unit number for output.
137 *> \author Univ. of Tennessee
138 *> \author Univ. of California Berkeley
139 *> \author Univ. of Colorado Denver
142 *> \date November 2011
144 *> \ingroup complex16_lin
146 * =====================================================================
147 SUBROUTINE ZCHKGT( DOTYPE, NN, NVAL, NNS, NSVAL, THRESH, TSTERR,
148 $ A, AF, B, X, XACT, WORK, RWORK, IWORK, NOUT )
150 * -- LAPACK test routine (version 3.4.0) --
151 * -- LAPACK is a software package provided by Univ. of Tennessee, --
152 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
155 * .. Scalar Arguments ..
157 INTEGER NN, NNS, NOUT
158 DOUBLE PRECISION THRESH
160 * .. Array Arguments ..
162 INTEGER IWORK( * ), NSVAL( * ), NVAL( * )
163 DOUBLE PRECISION RWORK( * )
164 COMPLEX*16 A( * ), AF( * ), B( * ), WORK( * ), X( * ),
168 * =====================================================================
171 DOUBLE PRECISION ONE, ZERO
172 PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
174 PARAMETER ( NTYPES = 12 )
176 PARAMETER ( NTESTS = 7 )
178 * .. Local Scalars ..
179 LOGICAL TRFCON, ZEROT
180 CHARACTER DIST, NORM, TRANS, TYPE
182 INTEGER I, IMAT, IN, INFO, IRHS, ITRAN, IX, IZERO, J,
183 $ K, KL, KOFF, KU, LDA, M, MODE, N, NERRS, NFAIL,
185 DOUBLE PRECISION AINVNM, ANORM, COND, RCOND, RCONDC, RCONDI,
189 CHARACTER TRANSS( 3 )
190 INTEGER ISEED( 4 ), ISEEDY( 4 )
191 DOUBLE PRECISION RESULT( NTESTS )
194 * .. External Functions ..
195 DOUBLE PRECISION DGET06, DZASUM, ZLANGT
196 EXTERNAL DGET06, DZASUM, ZLANGT
198 * .. External Subroutines ..
199 EXTERNAL ALAERH, ALAHD, ALASUM, ZCOPY, ZDSCAL, ZERRGE,
200 $ ZGET04, ZGTCON, ZGTRFS, ZGTT01, ZGTT02, ZGTT05,
201 $ ZGTTRF, ZGTTRS, ZLACPY, ZLAGTM, ZLARNV, ZLATB4,
204 * .. Intrinsic Functions ..
207 * .. Scalars in Common ..
212 * .. Common blocks ..
213 COMMON / INFOC / INFOT, NUNIT, OK, LERR
214 COMMON / SRNAMC / SRNAMT
216 * .. Data statements ..
217 DATA ISEEDY / 0, 0, 0, 1 / , TRANSS / 'N', 'T',
220 * .. Executable Statements ..
222 PATH( 1: 1 ) = 'Zomplex precision'
228 ISEED( I ) = ISEEDY( I )
231 * Test the error exits
234 $ CALL ZERRGE( PATH, NOUT )
239 * Do for each value of N in NVAL.
248 DO 100 IMAT = 1, NIMAT
250 * Do the tests only if DOTYPE( IMAT ) is true.
252 IF( .NOT.DOTYPE( IMAT ) )
255 * Set up parameters with ZLATB4.
257 CALL ZLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE,
260 ZEROT = IMAT.GE.8 .AND. IMAT.LE.10
263 * Types 1-6: generate matrices of known condition number.
265 KOFF = MAX( 2-KU, 3-MAX( 1, N ) )
267 CALL ZLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE, COND,
268 $ ANORM, KL, KU, 'Z', AF( KOFF ), 3, WORK,
271 * Check the error code from ZLATMS.
274 CALL ALAERH( PATH, 'ZLATMS', INFO, 0, ' ', N, N, KL,
275 $ KU, -1, IMAT, NFAIL, NERRS, NOUT )
281 CALL ZCOPY( N-1, AF( 4 ), 3, A, 1 )
282 CALL ZCOPY( N-1, AF( 3 ), 3, A( N+M+1 ), 1 )
284 CALL ZCOPY( N, AF( 2 ), 3, A( M+1 ), 1 )
287 * Types 7-12: generate tridiagonal matrices with
288 * unknown condition numbers.
290 IF( .NOT.ZEROT .OR. .NOT.DOTYPE( 7 ) ) THEN
292 * Generate a matrix with elements whose real and
293 * imaginary parts are from [-1,1].
295 CALL ZLARNV( 2, ISEED, N+2*M, A )
297 $ CALL ZDSCAL( N+2*M, ANORM, A, 1 )
298 ELSE IF( IZERO.GT.0 ) THEN
300 * Reuse the last matrix by copying back the zeroed out
303 IF( IZERO.EQ.1 ) THEN
307 ELSE IF( IZERO.EQ.N ) THEN
311 A( 2*N-2+IZERO ) = Z( 1 )
312 A( N-1+IZERO ) = Z( 2 )
317 * If IMAT > 7, set one column of the matrix to 0.
319 IF( .NOT.ZEROT ) THEN
321 ELSE IF( IMAT.EQ.8 ) THEN
329 ELSE IF( IMAT.EQ.9 ) THEN
337 DO 20 I = IZERO, N - 1
348 * Factor A as L*U and compute the ratio
349 * norm(L*U - A) / (n * norm(A) * EPS )
351 CALL ZCOPY( N+2*M, A, 1, AF, 1 )
353 CALL ZGTTRF( N, AF, AF( M+1 ), AF( N+M+1 ), AF( N+2*M+1 ),
356 * Check error code from ZGTTRF.
359 $ CALL ALAERH( PATH, 'ZGTTRF', INFO, IZERO, ' ', N, N, 1,
360 $ 1, -1, IMAT, NFAIL, NERRS, NOUT )
363 CALL ZGTT01( N, A, A( M+1 ), A( N+M+1 ), AF, AF( M+1 ),
364 $ AF( N+M+1 ), AF( N+2*M+1 ), IWORK, WORK, LDA,
365 $ RWORK, RESULT( 1 ) )
367 * Print the test ratio if it is .GE. THRESH.
369 IF( RESULT( 1 ).GE.THRESH ) THEN
370 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
371 $ CALL ALAHD( NOUT, PATH )
372 WRITE( NOUT, FMT = 9999 )N, IMAT, 1, RESULT( 1 )
378 TRANS = TRANSS( ITRAN )
379 IF( ITRAN.EQ.1 ) THEN
384 ANORM = ZLANGT( NORM, N, A, A( M+1 ), A( N+M+1 ) )
386 IF( .NOT.TRFCON ) THEN
388 * Use ZGTTRS to solve for one column at a time of
389 * inv(A), computing the maximum column sum as we go.
397 CALL ZGTTRS( TRANS, N, 1, AF, AF( M+1 ),
398 $ AF( N+M+1 ), AF( N+2*M+1 ), IWORK, X,
400 AINVNM = MAX( AINVNM, DZASUM( N, X, 1 ) )
403 * Compute RCONDC = 1 / (norm(A) * norm(inv(A))
405 IF( ANORM.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
408 RCONDC = ( ONE / ANORM ) / AINVNM
410 IF( ITRAN.EQ.1 ) THEN
420 * Estimate the reciprocal of the condition number of the
424 CALL ZGTCON( NORM, N, AF, AF( M+1 ), AF( N+M+1 ),
425 $ AF( N+2*M+1 ), IWORK, ANORM, RCOND, WORK,
428 * Check error code from ZGTCON.
431 $ CALL ALAERH( PATH, 'ZGTCON', INFO, 0, NORM, N, N, -1,
432 $ -1, -1, IMAT, NFAIL, NERRS, NOUT )
434 RESULT( 7 ) = DGET06( RCOND, RCONDC )
436 * Print the test ratio if it is .GE. THRESH.
438 IF( RESULT( 7 ).GE.THRESH ) THEN
439 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
440 $ CALL ALAHD( NOUT, PATH )
441 WRITE( NOUT, FMT = 9997 )NORM, N, IMAT, 7,
448 * Skip the remaining tests if the matrix is singular.
456 * Generate NRHS random solution vectors.
460 CALL ZLARNV( 2, ISEED, N, XACT( IX ) )
465 TRANS = TRANSS( ITRAN )
466 IF( ITRAN.EQ.1 ) THEN
472 * Set the right hand side.
474 CALL ZLAGTM( TRANS, N, NRHS, ONE, A, A( M+1 ),
475 $ A( N+M+1 ), XACT, LDA, ZERO, B, LDA )
478 * Solve op(A) * X = B and compute the residual.
480 CALL ZLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
482 CALL ZGTTRS( TRANS, N, NRHS, AF, AF( M+1 ),
483 $ AF( N+M+1 ), AF( N+2*M+1 ), IWORK, X,
486 * Check error code from ZGTTRS.
489 $ CALL ALAERH( PATH, 'ZGTTRS', INFO, 0, TRANS, N, N,
490 $ -1, -1, NRHS, IMAT, NFAIL, NERRS,
493 CALL ZLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
494 CALL ZGTT02( TRANS, N, NRHS, A, A( M+1 ), A( N+M+1 ),
495 $ X, LDA, WORK, LDA, RESULT( 2 ) )
498 * Check solution from generated exact solution.
500 CALL ZGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
504 * Use iterative refinement to improve the solution.
507 CALL ZGTRFS( TRANS, N, NRHS, A, A( M+1 ), A( N+M+1 ),
508 $ AF, AF( M+1 ), AF( N+M+1 ),
509 $ AF( N+2*M+1 ), IWORK, B, LDA, X, LDA,
510 $ RWORK, RWORK( NRHS+1 ), WORK,
511 $ RWORK( 2*NRHS+1 ), INFO )
513 * Check error code from ZGTRFS.
516 $ CALL ALAERH( PATH, 'ZGTRFS', INFO, 0, TRANS, N, N,
517 $ -1, -1, NRHS, IMAT, NFAIL, NERRS,
520 CALL ZGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
522 CALL ZGTT05( TRANS, N, NRHS, A, A( M+1 ), A( N+M+1 ),
523 $ B, LDA, X, LDA, XACT, LDA, RWORK,
524 $ RWORK( NRHS+1 ), RESULT( 5 ) )
526 * Print information about the tests that did not pass the
530 IF( RESULT( K ).GE.THRESH ) THEN
531 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
532 $ CALL ALAHD( NOUT, PATH )
533 WRITE( NOUT, FMT = 9998 )TRANS, N, NRHS, IMAT,
544 * Print a summary of the results.
546 CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS )
548 9999 FORMAT( 12X, 'N =', I5, ',', 10X, ' type ', I2, ', test(', I2,
550 9998 FORMAT( ' TRANS=''', A1, ''', N =', I5, ', NRHS=', I3, ', type ',
551 $ I2, ', test(', I2, ') = ', G12.5 )
552 9997 FORMAT( ' NORM =''', A1, ''', N =', I5, ',', 10X, ' type ', I2,
553 $ ', test(', I2, ') = ', G12.5 )