3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE ZDRVGB( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, A, LA,
12 * AFB, LAFB, ASAV, B, BSAV, X, XACT, S, WORK,
13 * RWORK, IWORK, NOUT )
15 * .. Scalar Arguments ..
17 * INTEGER LA, LAFB, NN, NOUT, NRHS
18 * DOUBLE PRECISION THRESH
20 * .. Array Arguments ..
22 * INTEGER IWORK( * ), NVAL( * )
23 * DOUBLE PRECISION RWORK( * ), S( * )
24 * COMPLEX*16 A( * ), AFB( * ), ASAV( * ), B( * ), BSAV( * ),
25 * $ WORK( * ), X( * ), XACT( * )
34 *> ZDRVGB tests the driver routines ZGBSV and -SVX.
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 N contained in the vector NVAL.
56 *> NVAL is INTEGER array, dimension (NN)
57 *> The values of the matrix column dimension N.
63 *> The number of right hand side vectors to be generated for
64 *> each linear system.
69 *> THRESH is DOUBLE PRECISION
70 *> The threshold value for the test ratios. A result is
71 *> included in the output file if RESULT >= THRESH. To have
72 *> every test ratio printed, use THRESH = 0.
78 *> Flag that indicates whether error exits are to be tested.
83 *> A is COMPLEX*16 array, dimension (LA)
89 *> The length of the array A. LA >= (2*NMAX-1)*NMAX
90 *> where NMAX is the largest entry in NVAL.
95 *> AFB is COMPLEX*16 array, dimension (LAFB)
101 *> The length of the array AFB. LAFB >= (3*NMAX-2)*NMAX
102 *> where NMAX is the largest entry in NVAL.
107 *> ASAV is COMPLEX*16 array, dimension (LA)
112 *> B is COMPLEX*16 array, dimension (NMAX*NRHS)
117 *> BSAV is COMPLEX*16 array, dimension (NMAX*NRHS)
122 *> X is COMPLEX*16 array, dimension (NMAX*NRHS)
127 *> XACT is COMPLEX*16 array, dimension (NMAX*NRHS)
132 *> S is DOUBLE PRECISION array, dimension (2*NMAX)
137 *> WORK is COMPLEX*16 array, dimension
138 *> (NMAX*max(3,NRHS,NMAX))
143 *> RWORK is DOUBLE PRECISION array, dimension
144 *> (max(NMAX,2*NRHS))
149 *> IWORK is INTEGER array, dimension (NMAX)
155 *> The unit number for output.
161 *> \author Univ. of Tennessee
162 *> \author Univ. of California Berkeley
163 *> \author Univ. of Colorado Denver
166 *> \date November 2015
168 *> \ingroup complex16_lin
170 * =====================================================================
171 SUBROUTINE ZDRVGB( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, A, LA,
172 $ AFB, LAFB, ASAV, B, BSAV, X, XACT, S, WORK,
173 $ RWORK, IWORK, NOUT )
175 * -- LAPACK test routine (version 3.6.0) --
176 * -- LAPACK is a software package provided by Univ. of Tennessee, --
177 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
180 * .. Scalar Arguments ..
182 INTEGER LA, LAFB, NN, NOUT, NRHS
183 DOUBLE PRECISION THRESH
185 * .. Array Arguments ..
187 INTEGER IWORK( * ), NVAL( * )
188 DOUBLE PRECISION RWORK( * ), S( * )
189 COMPLEX*16 A( * ), AFB( * ), ASAV( * ), B( * ), BSAV( * ),
190 $ WORK( * ), X( * ), XACT( * )
193 * =====================================================================
196 DOUBLE PRECISION ONE, ZERO
197 PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
199 PARAMETER ( NTYPES = 8 )
201 PARAMETER ( NTESTS = 7 )
203 PARAMETER ( NTRAN = 3 )
205 * .. Local Scalars ..
206 LOGICAL EQUIL, NOFACT, PREFAC, TRFCON, ZEROT
207 CHARACTER DIST, EQUED, FACT, TRANS, TYPE, XTYPE
209 INTEGER I, I1, I2, IEQUED, IFACT, IKL, IKU, IMAT, IN,
210 $ INFO, IOFF, ITRAN, IZERO, J, K, K1, KL, KU,
211 $ LDA, LDAFB, LDB, MODE, N, NB, NBMIN, NERRS,
212 $ NFACT, NFAIL, NIMAT, NKL, NKU, NRUN, NT
213 DOUBLE PRECISION AINVNM, AMAX, ANORM, ANORMI, ANORMO, ANRMPV,
214 $ CNDNUM, COLCND, RCOND, RCONDC, RCONDI, RCONDO,
215 $ ROLDC, ROLDI, ROLDO, ROWCND, RPVGRW
218 CHARACTER EQUEDS( 4 ), FACTS( 3 ), TRANSS( NTRAN )
219 INTEGER ISEED( 4 ), ISEEDY( 4 )
220 DOUBLE PRECISION RDUM( 1 ), RESULT( NTESTS )
222 * .. External Functions ..
224 DOUBLE PRECISION DGET06, DLAMCH, ZLANGB, ZLANGE, ZLANTB
225 EXTERNAL LSAME, DGET06, DLAMCH, ZLANGB, ZLANGE, ZLANTB
227 * .. External Subroutines ..
228 EXTERNAL ALADHD, ALAERH, ALASVM, XLAENV, ZERRVX, ZGBEQU,
229 $ ZGBSV, ZGBSVX, ZGBT01, ZGBT02, ZGBT05, ZGBTRF,
230 $ ZGBTRS, ZGET04, ZLACPY, ZLAQGB, ZLARHS, ZLASET,
233 * .. Intrinsic Functions ..
234 INTRINSIC ABS, DCMPLX, MAX, MIN
236 * .. Scalars in Common ..
241 * .. Common blocks ..
242 COMMON / INFOC / INFOT, NUNIT, OK, LERR
243 COMMON / SRNAMC / SRNAMT
245 * .. Data statements ..
246 DATA ISEEDY / 1988, 1989, 1990, 1991 /
247 DATA TRANSS / 'N', 'T', 'C' /
248 DATA FACTS / 'F', 'N', 'E' /
249 DATA EQUEDS / 'N', 'R', 'C', 'B' /
251 * .. Executable Statements ..
253 * Initialize constants and the random number seed.
255 PATH( 1: 1 ) = 'Zomplex precision'
261 ISEED( I ) = ISEEDY( I )
264 * Test the error exits
267 $ CALL ZERRVX( PATH, NOUT )
270 * Set the block size and minimum block size for testing.
275 CALL XLAENV( 2, NBMIN )
277 * Do for each value of N in NVAL
284 * Set limits on the number of loop iterations.
286 NKL = MAX( 1, MIN( N, 4 ) )
296 * Do for KL = 0, N-1, (3N-1)/4, and (N+1)/4. This order makes
297 * it easier to skip redundant values for small values of N.
301 ELSE IF( IKL.EQ.2 ) THEN
303 ELSE IF( IKL.EQ.3 ) THEN
305 ELSE IF( IKL.EQ.4 ) THEN
310 * Do for KU = 0, N-1, (3N-1)/4, and (N+1)/4. This order
311 * makes it easier to skip redundant values for small
316 ELSE IF( IKU.EQ.2 ) THEN
318 ELSE IF( IKU.EQ.3 ) THEN
320 ELSE IF( IKU.EQ.4 ) THEN
324 * Check that A and AFB are big enough to generate this
328 LDAFB = 2*KL + KU + 1
329 IF( LDA*N.GT.LA .OR. LDAFB*N.GT.LAFB ) THEN
330 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
331 $ CALL ALADHD( NOUT, PATH )
332 IF( LDA*N.GT.LA ) THEN
333 WRITE( NOUT, FMT = 9999 )LA, N, KL, KU,
337 IF( LDAFB*N.GT.LAFB ) THEN
338 WRITE( NOUT, FMT = 9998 )LAFB, N, KL, KU,
345 DO 120 IMAT = 1, NIMAT
347 * Do the tests only if DOTYPE( IMAT ) is true.
349 IF( .NOT.DOTYPE( IMAT ) )
352 * Skip types 2, 3, or 4 if the matrix is too small.
354 ZEROT = IMAT.GE.2 .AND. IMAT.LE.4
355 IF( ZEROT .AND. N.LT.IMAT-1 )
358 * Set up parameters with ZLATB4 and generate a
359 * test matrix with ZLATMS.
361 CALL ZLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM,
362 $ MODE, CNDNUM, DIST )
363 RCONDC = ONE / CNDNUM
366 CALL ZLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE,
367 $ CNDNUM, ANORM, KL, KU, 'Z', A, LDA, WORK,
370 * Check the error code from ZLATMS.
373 CALL ALAERH( PATH, 'ZLATMS', INFO, 0, ' ', N, N,
374 $ KL, KU, -1, IMAT, NFAIL, NERRS, NOUT )
378 * For types 2, 3, and 4, zero one or more columns of
379 * the matrix to test that INFO is returned correctly.
385 ELSE IF( IMAT.EQ.3 ) THEN
390 IOFF = ( IZERO-1 )*LDA
392 I1 = MAX( 1, KU+2-IZERO )
393 I2 = MIN( KL+KU+1, KU+1+( N-IZERO ) )
399 DO 30 I = MAX( 1, KU+2-J ),
400 $ MIN( KL+KU+1, KU+1+( N-J ) )
408 * Save a copy of the matrix A in ASAV.
410 CALL ZLACPY( 'Full', KL+KU+1, N, A, LDA, ASAV, LDA )
413 EQUED = EQUEDS( IEQUED )
414 IF( IEQUED.EQ.1 ) THEN
420 DO 100 IFACT = 1, NFACT
421 FACT = FACTS( IFACT )
422 PREFAC = LSAME( FACT, 'F' )
423 NOFACT = LSAME( FACT, 'N' )
424 EQUIL = LSAME( FACT, 'E' )
432 ELSE IF( .NOT.NOFACT ) THEN
434 * Compute the condition number for comparison
435 * with the value returned by DGESVX (FACT =
436 * 'N' reuses the condition number from the
437 * previous iteration with FACT = 'F').
439 CALL ZLACPY( 'Full', KL+KU+1, N, ASAV, LDA,
440 $ AFB( KL+1 ), LDAFB )
441 IF( EQUIL .OR. IEQUED.GT.1 ) THEN
443 * Compute row and column scale factors to
444 * equilibrate the matrix A.
446 CALL ZGBEQU( N, N, KL, KU, AFB( KL+1 ),
447 $ LDAFB, S, S( N+1 ), ROWCND,
448 $ COLCND, AMAX, INFO )
449 IF( INFO.EQ.0 .AND. N.GT.0 ) THEN
450 IF( LSAME( EQUED, 'R' ) ) THEN
453 ELSE IF( LSAME( EQUED, 'C' ) ) THEN
456 ELSE IF( LSAME( EQUED, 'B' ) ) THEN
461 * Equilibrate the matrix.
463 CALL ZLAQGB( N, N, KL, KU, AFB( KL+1 ),
464 $ LDAFB, S, S( N+1 ),
465 $ ROWCND, COLCND, AMAX,
470 * Save the condition number of the
471 * non-equilibrated system for use in ZGET04.
478 * Compute the 1-norm and infinity-norm of A.
480 ANORMO = ZLANGB( '1', N, KL, KU, AFB( KL+1 ),
482 ANORMI = ZLANGB( 'I', N, KL, KU, AFB( KL+1 ),
485 * Factor the matrix A.
487 CALL ZGBTRF( N, N, KL, KU, AFB, LDAFB, IWORK,
490 * Form the inverse of A.
492 CALL ZLASET( 'Full', N, N, DCMPLX( ZERO ),
493 $ DCMPLX( ONE ), WORK, LDB )
495 CALL ZGBTRS( 'No transpose', N, KL, KU, N,
496 $ AFB, LDAFB, IWORK, WORK, LDB,
499 * Compute the 1-norm condition number of A.
501 AINVNM = ZLANGE( '1', N, N, WORK, LDB,
503 IF( ANORMO.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
506 RCONDO = ( ONE / ANORMO ) / AINVNM
509 * Compute the infinity-norm condition number
512 AINVNM = ZLANGE( 'I', N, N, WORK, LDB,
514 IF( ANORMI.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
517 RCONDI = ( ONE / ANORMI ) / AINVNM
521 DO 90 ITRAN = 1, NTRAN
523 * Do for each value of TRANS.
525 TRANS = TRANSS( ITRAN )
526 IF( ITRAN.EQ.1 ) THEN
532 * Restore the matrix A.
534 CALL ZLACPY( 'Full', KL+KU+1, N, ASAV, LDA,
537 * Form an exact solution and set the right hand
541 CALL ZLARHS( PATH, XTYPE, 'Full', TRANS, N,
542 $ N, KL, KU, NRHS, A, LDA, XACT,
543 $ LDB, B, LDB, ISEED, INFO )
545 CALL ZLACPY( 'Full', N, NRHS, B, LDB, BSAV,
548 IF( NOFACT .AND. ITRAN.EQ.1 ) THEN
552 * Compute the LU factorization of the matrix
553 * and solve the system.
555 CALL ZLACPY( 'Full', KL+KU+1, N, A, LDA,
556 $ AFB( KL+1 ), LDAFB )
557 CALL ZLACPY( 'Full', N, NRHS, B, LDB, X,
561 CALL ZGBSV( N, KL, KU, NRHS, AFB, LDAFB,
562 $ IWORK, X, LDB, INFO )
564 * Check error code from ZGBSV .
567 $ CALL ALAERH( PATH, 'ZGBSV ', INFO,
568 $ IZERO, ' ', N, N, KL, KU,
569 $ NRHS, IMAT, NFAIL, NERRS,
572 * Reconstruct matrix from factors and
575 CALL ZGBT01( N, N, KL, KU, A, LDA, AFB,
576 $ LDAFB, IWORK, WORK,
579 IF( IZERO.EQ.0 ) THEN
581 * Compute residual of the computed
584 CALL ZLACPY( 'Full', N, NRHS, B, LDB,
586 CALL ZGBT02( 'No transpose', N, N, KL,
587 $ KU, NRHS, A, LDA, X, LDB,
588 $ WORK, LDB, RESULT( 2 ) )
590 * Check solution from generated exact
593 CALL ZGET04( N, NRHS, X, LDB, XACT,
594 $ LDB, RCONDC, RESULT( 3 ) )
598 * Print information about the tests that did
599 * not pass the threshold.
602 IF( RESULT( K ).GE.THRESH ) THEN
603 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
604 $ CALL ALADHD( NOUT, PATH )
605 WRITE( NOUT, FMT = 9997 )'ZGBSV ',
606 $ N, KL, KU, IMAT, K, RESULT( K )
613 * --- Test ZGBSVX ---
616 $ CALL ZLASET( 'Full', 2*KL+KU+1, N,
618 $ DCMPLX( ZERO ), AFB, LDAFB )
619 CALL ZLASET( 'Full', N, NRHS, DCMPLX( ZERO ),
620 $ DCMPLX( ZERO ), X, LDB )
621 IF( IEQUED.GT.1 .AND. N.GT.0 ) THEN
623 * Equilibrate the matrix if FACT = 'F' and
624 * EQUED = 'R', 'C', or 'B'.
626 CALL ZLAQGB( N, N, KL, KU, A, LDA, S,
627 $ S( N+1 ), ROWCND, COLCND,
631 * Solve the system and compute the condition
632 * number and error bounds using ZGBSVX.
635 CALL ZGBSVX( FACT, TRANS, N, KL, KU, NRHS, A,
636 $ LDA, AFB, LDAFB, IWORK, EQUED,
637 $ S, S( LDB+1 ), B, LDB, X, LDB,
638 $ RCOND, RWORK, RWORK( NRHS+1 ),
639 $ WORK, RWORK( 2*NRHS+1 ), INFO )
641 * Check the error code from ZGBSVX.
644 $ CALL ALAERH( PATH, 'ZGBSVX', INFO, IZERO,
645 $ FACT // TRANS, N, N, KL, KU,
646 $ NRHS, IMAT, NFAIL, NERRS,
648 * Compare RWORK(2*NRHS+1) from ZGBSVX with the
649 * computed reciprocal pivot growth RPVGRW
651 IF( INFO.NE.0 .AND. INFO.LE.N) THEN
654 DO 60 I = MAX( KU+2-J, 1 ),
655 $ MIN( N+KU+1-J, KL+KU+1 )
656 ANRMPV = MAX( ANRMPV,
657 $ ABS( A( I+( J-1 )*LDA ) ) )
660 RPVGRW = ZLANTB( 'M', 'U', 'N', INFO,
661 $ MIN( INFO-1, KL+KU ),
662 $ AFB( MAX( 1, KL+KU+2-INFO ) ),
664 IF( RPVGRW.EQ.ZERO ) THEN
667 RPVGRW = ANRMPV / RPVGRW
670 RPVGRW = ZLANTB( 'M', 'U', 'N', N, KL+KU,
672 IF( RPVGRW.EQ.ZERO ) THEN
675 RPVGRW = ZLANGB( 'M', N, KL, KU, A,
676 $ LDA, RDUM ) / RPVGRW
679 RESULT( 7 ) = ABS( RPVGRW-RWORK( 2*NRHS+1 ) )
680 $ / MAX( RWORK( 2*NRHS+1 ),
681 $ RPVGRW ) / DLAMCH( 'E' )
683 IF( .NOT.PREFAC ) THEN
685 * Reconstruct matrix from factors and
688 CALL ZGBT01( N, N, KL, KU, A, LDA, AFB,
689 $ LDAFB, IWORK, WORK,
699 * Compute residual of the computed solution.
701 CALL ZLACPY( 'Full', N, NRHS, BSAV, LDB,
703 CALL ZGBT02( TRANS, N, N, KL, KU, NRHS,
704 $ ASAV, LDA, X, LDB, WORK, LDB,
707 * Check solution from generated exact
710 IF( NOFACT .OR. ( PREFAC .AND.
711 $ LSAME( EQUED, 'N' ) ) ) THEN
712 CALL ZGET04( N, NRHS, X, LDB, XACT,
713 $ LDB, RCONDC, RESULT( 3 ) )
715 IF( ITRAN.EQ.1 ) THEN
720 CALL ZGET04( N, NRHS, X, LDB, XACT,
721 $ LDB, ROLDC, RESULT( 3 ) )
724 * Check the error bounds from iterative
727 CALL ZGBT05( TRANS, N, KL, KU, NRHS, ASAV,
728 $ LDA, BSAV, LDB, X, LDB, XACT,
729 $ LDB, RWORK, RWORK( NRHS+1 ),
735 * Compare RCOND from ZGBSVX with the computed
738 RESULT( 6 ) = DGET06( RCOND, RCONDC )
740 * Print information about the tests that did
741 * not pass the threshold.
743 IF( .NOT.TRFCON ) THEN
745 IF( RESULT( K ).GE.THRESH ) THEN
746 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
747 $ CALL ALADHD( NOUT, PATH )
749 WRITE( NOUT, FMT = 9995 )
750 $ 'ZGBSVX', FACT, TRANS, N, KL,
751 $ KU, EQUED, IMAT, K,
754 WRITE( NOUT, FMT = 9996 )
755 $ 'ZGBSVX', FACT, TRANS, N, KL,
756 $ KU, IMAT, K, RESULT( K )
761 NRUN = NRUN + NTESTS - K1 + 1
763 IF( RESULT( 1 ).GE.THRESH .AND. .NOT.
765 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
766 $ CALL ALADHD( NOUT, PATH )
768 WRITE( NOUT, FMT = 9995 )'ZGBSVX',
769 $ FACT, TRANS, N, KL, KU, EQUED,
770 $ IMAT, 1, RESULT( 1 )
772 WRITE( NOUT, FMT = 9996 )'ZGBSVX',
773 $ FACT, TRANS, N, KL, KU, IMAT, 1,
779 IF( RESULT( 6 ).GE.THRESH ) THEN
780 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
781 $ CALL ALADHD( NOUT, PATH )
783 WRITE( NOUT, FMT = 9995 )'ZGBSVX',
784 $ FACT, TRANS, N, KL, KU, EQUED,
785 $ IMAT, 6, RESULT( 6 )
787 WRITE( NOUT, FMT = 9996 )'ZGBSVX',
788 $ FACT, TRANS, N, KL, KU, IMAT, 6,
794 IF( RESULT( 7 ).GE.THRESH ) THEN
795 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
796 $ CALL ALADHD( NOUT, PATH )
798 WRITE( NOUT, FMT = 9995 )'ZGBSVX',
799 $ FACT, TRANS, N, KL, KU, EQUED,
800 $ IMAT, 7, RESULT( 7 )
802 WRITE( NOUT, FMT = 9996 )'ZGBSVX',
803 $ FACT, TRANS, N, KL, KU, IMAT, 7,
818 * Print a summary of the results.
820 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
822 9999 FORMAT( ' *** In ZDRVGB, LA=', I5, ' is too small for N=', I5,
823 $ ', KU=', I5, ', KL=', I5, / ' ==> Increase LA to at least ',
825 9998 FORMAT( ' *** In ZDRVGB, LAFB=', I5, ' is too small for N=', I5,
826 $ ', KU=', I5, ', KL=', I5, /
827 $ ' ==> Increase LAFB to at least ', I5 )
828 9997 FORMAT( 1X, A, ', N=', I5, ', KL=', I5, ', KU=', I5, ', type ',
829 $ I1, ', test(', I1, ')=', G12.5 )
830 9996 FORMAT( 1X, A, '( ''', A1, ''',''', A1, ''',', I5, ',', I5, ',',
831 $ I5, ',...), type ', I1, ', test(', I1, ')=', G12.5 )
832 9995 FORMAT( 1X, A, '( ''', A1, ''',''', A1, ''',', I5, ',', I5, ',',
833 $ I5, ',...), EQUED=''', A1, ''', type ', I1, ', test(', I1,