3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE SDRVGT( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, A, AF,
12 * B, X, XACT, WORK, RWORK, IWORK, NOUT )
14 * .. Scalar Arguments ..
16 * INTEGER NN, NOUT, NRHS
19 * .. Array Arguments ..
21 * INTEGER IWORK( * ), NVAL( * )
22 * REAL A( * ), AF( * ), B( * ), RWORK( * ), WORK( * ),
32 *> SDRVGT tests SGTSV and -SVX.
40 *> DOTYPE is LOGICAL array, dimension (NTYPES)
41 *> The matrix types to be used for testing. Matrices of type j
42 *> (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) =
43 *> .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used.
49 *> The number of values of N contained in the vector NVAL.
54 *> NVAL is INTEGER array, dimension (NN)
55 *> The values of the matrix dimension N.
61 *> The number of right hand sides, NRHS >= 0.
67 *> The threshold value for the test ratios. A result is
68 *> included in the output file if RESULT >= THRESH. To have
69 *> every test ratio printed, use THRESH = 0.
75 *> Flag that indicates whether error exits are to be tested.
80 *> A is REAL array, dimension (NMAX*4)
85 *> AF is REAL array, dimension (NMAX*4)
90 *> B is REAL array, dimension (NMAX*NRHS)
95 *> X is REAL array, dimension (NMAX*NRHS)
100 *> XACT is REAL array, dimension (NMAX*NRHS)
105 *> WORK is REAL array, dimension
106 *> (NMAX*max(3,NRHS))
111 *> RWORK is REAL array, dimension
112 *> (max(NMAX,2*NRHS))
117 *> IWORK is INTEGER array, dimension (2*NMAX)
123 *> The unit number for output.
129 *> \author Univ. of Tennessee
130 *> \author Univ. of California Berkeley
131 *> \author Univ. of Colorado Denver
134 *> \date November 2011
136 *> \ingroup single_lin
138 * =====================================================================
139 SUBROUTINE SDRVGT( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, A, AF,
140 $ B, X, XACT, WORK, RWORK, IWORK, NOUT )
142 * -- LAPACK test routine (version 3.4.0) --
143 * -- LAPACK is a software package provided by Univ. of Tennessee, --
144 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
147 * .. Scalar Arguments ..
149 INTEGER NN, NOUT, NRHS
152 * .. Array Arguments ..
154 INTEGER IWORK( * ), NVAL( * )
155 REAL A( * ), AF( * ), B( * ), RWORK( * ), WORK( * ),
159 * =====================================================================
163 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
165 PARAMETER ( NTYPES = 12 )
167 PARAMETER ( NTESTS = 6 )
169 * .. Local Scalars ..
170 LOGICAL TRFCON, ZEROT
171 CHARACTER DIST, FACT, TRANS, TYPE
173 INTEGER I, IFACT, IMAT, IN, INFO, ITRAN, IX, IZERO, J,
174 $ K, K1, KL, KOFF, KU, LDA, M, MODE, N, NERRS,
175 $ NFAIL, NIMAT, NRUN, NT
176 REAL AINVNM, ANORM, ANORMI, ANORMO, COND, RCOND,
177 $ RCONDC, RCONDI, RCONDO
180 CHARACTER TRANSS( 3 )
181 INTEGER ISEED( 4 ), ISEEDY( 4 )
182 REAL RESULT( NTESTS ), Z( 3 )
184 * .. External Functions ..
185 REAL SASUM, SGET06, SLANGT
186 EXTERNAL SASUM, SGET06, SLANGT
188 * .. External Subroutines ..
189 EXTERNAL ALADHD, ALAERH, ALASVM, SCOPY, SERRVX, SGET04,
190 $ SGTSV, SGTSVX, SGTT01, SGTT02, SGTT05, SGTTRF,
191 $ SGTTRS, SLACPY, SLAGTM, SLARNV, SLASET, SLATB4,
194 * .. Intrinsic Functions ..
197 * .. Scalars in Common ..
202 * .. Common blocks ..
203 COMMON / INFOC / INFOT, NUNIT, OK, LERR
204 COMMON / SRNAMC / SRNAMT
206 * .. Data statements ..
207 DATA ISEEDY / 0, 0, 0, 1 / , TRANSS / 'N', 'T',
210 * .. Executable Statements ..
212 PATH( 1: 1 ) = 'Single precision'
218 ISEED( I ) = ISEEDY( I )
221 * Test the error exits
224 $ CALL SERRVX( PATH, NOUT )
229 * Do for each value of N in NVAL.
238 DO 130 IMAT = 1, NIMAT
240 * Do the tests only if DOTYPE( IMAT ) is true.
242 IF( .NOT.DOTYPE( IMAT ) )
245 * Set up parameters with SLATB4.
247 CALL SLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE,
250 ZEROT = IMAT.GE.8 .AND. IMAT.LE.10
253 * Types 1-6: generate matrices of known condition number.
255 KOFF = MAX( 2-KU, 3-MAX( 1, N ) )
257 CALL SLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE, COND,
258 $ ANORM, KL, KU, 'Z', AF( KOFF ), 3, WORK,
261 * Check the error code from SLATMS.
264 CALL ALAERH( PATH, 'SLATMS', INFO, 0, ' ', N, N, KL,
265 $ KU, -1, IMAT, NFAIL, NERRS, NOUT )
271 CALL SCOPY( N-1, AF( 4 ), 3, A, 1 )
272 CALL SCOPY( N-1, AF( 3 ), 3, A( N+M+1 ), 1 )
274 CALL SCOPY( N, AF( 2 ), 3, A( M+1 ), 1 )
277 * Types 7-12: generate tridiagonal matrices with
278 * unknown condition numbers.
280 IF( .NOT.ZEROT .OR. .NOT.DOTYPE( 7 ) ) THEN
282 * Generate a matrix with elements from [-1,1].
284 CALL SLARNV( 2, ISEED, N+2*M, A )
286 $ CALL SSCAL( N+2*M, ANORM, A, 1 )
287 ELSE IF( IZERO.GT.0 ) THEN
289 * Reuse the last matrix by copying back the zeroed out
292 IF( IZERO.EQ.1 ) THEN
296 ELSE IF( IZERO.EQ.N ) THEN
300 A( 2*N-2+IZERO ) = Z( 1 )
301 A( N-1+IZERO ) = Z( 2 )
306 * If IMAT > 7, set one column of the matrix to 0.
308 IF( .NOT.ZEROT ) THEN
310 ELSE IF( IMAT.EQ.8 ) THEN
318 ELSE IF( IMAT.EQ.9 ) THEN
326 DO 20 I = IZERO, N - 1
337 IF( IFACT.EQ.1 ) THEN
343 * Compute the condition number for comparison with
344 * the value returned by SGTSVX.
352 ELSE IF( IFACT.EQ.1 ) THEN
353 CALL SCOPY( N+2*M, A, 1, AF, 1 )
355 * Compute the 1-norm and infinity-norm of A.
357 ANORMO = SLANGT( '1', N, A, A( M+1 ), A( N+M+1 ) )
358 ANORMI = SLANGT( 'I', N, A, A( M+1 ), A( N+M+1 ) )
360 * Factor the matrix A.
362 CALL SGTTRF( N, AF, AF( M+1 ), AF( N+M+1 ),
363 $ AF( N+2*M+1 ), IWORK, INFO )
365 * Use SGTTRS to solve for one column at a time of
366 * inv(A), computing the maximum column sum as we go.
374 CALL SGTTRS( 'No transpose', N, 1, AF, AF( M+1 ),
375 $ AF( N+M+1 ), AF( N+2*M+1 ), IWORK, X,
377 AINVNM = MAX( AINVNM, SASUM( N, X, 1 ) )
380 * Compute the 1-norm condition number of A.
382 IF( ANORMO.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
385 RCONDO = ( ONE / ANORMO ) / AINVNM
388 * Use SGTTRS to solve for one column at a time of
389 * inv(A'), computing the maximum column sum as we go.
397 CALL SGTTRS( 'Transpose', N, 1, AF, AF( M+1 ),
398 $ AF( N+M+1 ), AF( N+2*M+1 ), IWORK, X,
400 AINVNM = MAX( AINVNM, SASUM( N, X, 1 ) )
403 * Compute the infinity-norm condition number of A.
405 IF( ANORMI.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
408 RCONDI = ( ONE / ANORMI ) / AINVNM
413 TRANS = TRANSS( ITRAN )
414 IF( ITRAN.EQ.1 ) THEN
420 * Generate NRHS random solution vectors.
424 CALL SLARNV( 2, ISEED, N, XACT( IX ) )
428 * Set the right hand side.
430 CALL SLAGTM( TRANS, N, NRHS, ONE, A, A( M+1 ),
431 $ A( N+M+1 ), XACT, LDA, ZERO, B, LDA )
433 IF( IFACT.EQ.2 .AND. ITRAN.EQ.1 ) THEN
437 * Solve the system using Gaussian elimination with
440 CALL SCOPY( N+2*M, A, 1, AF, 1 )
441 CALL SLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
444 CALL SGTSV( N, NRHS, AF, AF( M+1 ), AF( N+M+1 ), X,
447 * Check error code from SGTSV .
450 $ CALL ALAERH( PATH, 'SGTSV ', INFO, IZERO, ' ',
451 $ N, N, 1, 1, NRHS, IMAT, NFAIL,
454 IF( IZERO.EQ.0 ) THEN
456 * Check residual of computed solution.
458 CALL SLACPY( 'Full', N, NRHS, B, LDA, WORK,
460 CALL SGTT02( TRANS, N, NRHS, A, A( M+1 ),
461 $ A( N+M+1 ), X, LDA, WORK, LDA,
464 * Check solution from generated exact solution.
466 CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
471 * Print information about the tests that did not pass
475 IF( RESULT( K ).GE.THRESH ) THEN
476 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
477 $ CALL ALADHD( NOUT, PATH )
478 WRITE( NOUT, FMT = 9999 )'SGTSV ', N, IMAT,
486 * --- Test SGTSVX ---
488 IF( IFACT.GT.1 ) THEN
490 * Initialize AF to zero.
496 CALL SLASET( 'Full', N, NRHS, ZERO, ZERO, X, LDA )
498 * Solve the system and compute the condition number and
499 * error bounds using SGTSVX.
502 CALL SGTSVX( FACT, TRANS, N, NRHS, A, A( M+1 ),
503 $ A( N+M+1 ), AF, AF( M+1 ), AF( N+M+1 ),
504 $ AF( N+2*M+1 ), IWORK, B, LDA, X, LDA,
505 $ RCOND, RWORK, RWORK( NRHS+1 ), WORK,
506 $ IWORK( N+1 ), INFO )
508 * Check the error code from SGTSVX.
511 $ CALL ALAERH( PATH, 'SGTSVX', INFO, IZERO,
512 $ FACT // TRANS, N, N, 1, 1, NRHS, IMAT,
513 $ NFAIL, NERRS, NOUT )
515 IF( IFACT.GE.2 ) THEN
517 * Reconstruct matrix from factors and compute
520 CALL SGTT01( N, A, A( M+1 ), A( N+M+1 ), AF,
521 $ AF( M+1 ), AF( N+M+1 ), AF( N+2*M+1 ),
522 $ IWORK, WORK, LDA, RWORK, RESULT( 1 ) )
531 * Check residual of computed solution.
533 CALL SLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
534 CALL SGTT02( TRANS, N, NRHS, A, A( M+1 ),
535 $ A( N+M+1 ), X, LDA, WORK, LDA,
538 * Check solution from generated exact solution.
540 CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
543 * Check the error bounds from iterative refinement.
545 CALL SGTT05( TRANS, N, NRHS, A, A( M+1 ),
546 $ A( N+M+1 ), B, LDA, X, LDA, XACT, LDA,
547 $ RWORK, RWORK( NRHS+1 ), RESULT( 4 ) )
551 * Print information about the tests that did not pass
555 IF( RESULT( K ).GE.THRESH ) THEN
556 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
557 $ CALL ALADHD( NOUT, PATH )
558 WRITE( NOUT, FMT = 9998 )'SGTSVX', FACT, TRANS,
559 $ N, IMAT, K, RESULT( K )
564 * Check the reciprocal of the condition number.
566 RESULT( 6 ) = SGET06( RCOND, RCONDC )
567 IF( RESULT( 6 ).GE.THRESH ) THEN
568 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
569 $ CALL ALADHD( NOUT, PATH )
570 WRITE( NOUT, FMT = 9998 )'SGTSVX', FACT, TRANS, N,
571 $ IMAT, K, RESULT( K )
574 NRUN = NRUN + NT - K1 + 2
581 * Print a summary of the results.
583 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
585 9999 FORMAT( 1X, A, ', N =', I5, ', type ', I2, ', test ', I2,
586 $ ', ratio = ', G12.5 )
587 9998 FORMAT( 1X, A, ', FACT=''', A1, ''', TRANS=''', A1, ''', N =',
588 $ I5, ', type ', I2, ', test ', I2, ', ratio = ', G12.5 )