1*> \brief \b ZCHKGB
2*
3*  =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6*            http://www.netlib.org/lapack/explore-html/
7*
8*  Definition:
9*  ===========
10*
11*       SUBROUTINE ZCHKGB( DOTYPE, NM, MVAL, NN, NVAL, NNB, NBVAL, NNS,
12*                          NSVAL, THRESH, TSTERR, A, LA, AFAC, LAFAC, B,
13*                          X, XACT, WORK, RWORK, IWORK, NOUT )
14*
15*       .. Scalar Arguments ..
16*       LOGICAL            TSTERR
17*       INTEGER            LA, LAFAC, NM, NN, NNB, NNS, NOUT
18*       DOUBLE PRECISION   THRESH
19*       ..
20*       .. Array Arguments ..
21*       LOGICAL            DOTYPE( * )
22*       INTEGER            IWORK( * ), MVAL( * ), NBVAL( * ), NSVAL( * ),
23*      $                   NVAL( * )
24*       DOUBLE PRECISION   RWORK( * )
25*       COMPLEX*16         A( * ), AFAC( * ), B( * ), WORK( * ), X( * ),
26*      $                   XACT( * )
27*       ..
28*
29*
30*> \par Purpose:
31*  =============
32*>
33*> \verbatim
34*>
35*> ZCHKGB tests ZGBTRF, -TRS, -RFS, and -CON
36*> \endverbatim
37*
38*  Arguments:
39*  ==========
40*
41*> \param[in] DOTYPE
42*> \verbatim
43*>          DOTYPE is LOGICAL array, dimension (NTYPES)
44*>          The matrix types to be used for testing.  Matrices of type j
45*>          (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) =
46*>          .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used.
47*> \endverbatim
48*>
49*> \param[in] NM
50*> \verbatim
51*>          NM is INTEGER
52*>          The number of values of M contained in the vector MVAL.
53*> \endverbatim
54*>
55*> \param[in] MVAL
56*> \verbatim
57*>          MVAL is INTEGER array, dimension (NM)
58*>          The values of the matrix row dimension M.
59*> \endverbatim
60*>
61*> \param[in] NN
62*> \verbatim
63*>          NN is INTEGER
64*>          The number of values of N contained in the vector NVAL.
65*> \endverbatim
66*>
67*> \param[in] NVAL
68*> \verbatim
69*>          NVAL is INTEGER array, dimension (NN)
70*>          The values of the matrix column dimension N.
71*> \endverbatim
72*>
73*> \param[in] NNB
74*> \verbatim
75*>          NNB is INTEGER
76*>          The number of values of NB contained in the vector NBVAL.
77*> \endverbatim
78*>
79*> \param[in] NBVAL
80*> \verbatim
81*>          NBVAL is INTEGER array, dimension (NNB)
82*>          The values of the blocksize NB.
83*> \endverbatim
84*>
85*> \param[in] NNS
86*> \verbatim
87*>          NNS is INTEGER
88*>          The number of values of NRHS contained in the vector NSVAL.
89*> \endverbatim
90*>
91*> \param[in] NSVAL
92*> \verbatim
93*>          NSVAL is INTEGER array, dimension (NNS)
94*>          The values of the number of right hand sides NRHS.
95*> \endverbatim
96*>
97*> \param[in] THRESH
98*> \verbatim
99*>          THRESH is DOUBLE PRECISION
100*>          The threshold value for the test ratios.  A result is
101*>          included in the output file if RESULT >= THRESH.  To have
102*>          every test ratio printed, use THRESH = 0.
103*> \endverbatim
104*>
105*> \param[in] TSTERR
106*> \verbatim
107*>          TSTERR is LOGICAL
108*>          Flag that indicates whether error exits are to be tested.
109*> \endverbatim
110*>
111*> \param[out] A
112*> \verbatim
113*>          A is COMPLEX*16 array, dimension (LA)
114*> \endverbatim
115*>
116*> \param[in] LA
117*> \verbatim
118*>          LA is INTEGER
119*>          The length of the array A.  LA >= (KLMAX+KUMAX+1)*NMAX
120*>          where KLMAX is the largest entry in the local array KLVAL,
121*>                KUMAX is the largest entry in the local array KUVAL and
122*>                NMAX is the largest entry in the input array NVAL.
123*> \endverbatim
124*>
125*> \param[out] AFAC
126*> \verbatim
127*>          AFAC is COMPLEX*16 array, dimension (LAFAC)
128*> \endverbatim
129*>
130*> \param[in] LAFAC
131*> \verbatim
132*>          LAFAC is INTEGER
133*>          The length of the array AFAC. LAFAC >= (2*KLMAX+KUMAX+1)*NMAX
134*>          where KLMAX is the largest entry in the local array KLVAL,
135*>                KUMAX is the largest entry in the local array KUVAL and
136*>                NMAX is the largest entry in the input array NVAL.
137*> \endverbatim
138*>
139*> \param[out] B
140*> \verbatim
141*>          B is COMPLEX*16 array, dimension (NMAX*NSMAX)
142*> \endverbatim
143*>
144*> \param[out] X
145*> \verbatim
146*>          X is COMPLEX*16 array, dimension (NMAX*NSMAX)
147*> \endverbatim
148*>
149*> \param[out] XACT
150*> \verbatim
151*>          XACT is COMPLEX*16 array, dimension (NMAX*NSMAX)
152*> \endverbatim
153*>
154*> \param[out] WORK
155*> \verbatim
156*>          WORK is COMPLEX*16 array, dimension
157*>                      (NMAX*max(3,NSMAX,NMAX))
158*> \endverbatim
159*>
160*> \param[out] RWORK
161*> \verbatim
162*>          RWORK is DOUBLE PRECISION array, dimension
163*>                      (NMAX+2*NSMAX)
164*> \endverbatim
165*>
166*> \param[out] IWORK
167*> \verbatim
168*>          IWORK is INTEGER array, dimension (NMAX)
169*> \endverbatim
170*>
171*> \param[in] NOUT
172*> \verbatim
173*>          NOUT is INTEGER
174*>          The unit number for output.
175*> \endverbatim
176*
177*  Authors:
178*  ========
179*
180*> \author Univ. of Tennessee
181*> \author Univ. of California Berkeley
182*> \author Univ. of Colorado Denver
183*> \author NAG Ltd.
184*
185*> \ingroup complex16_lin
186*
187*  =====================================================================
188      SUBROUTINE ZCHKGB( DOTYPE, NM, MVAL, NN, NVAL, NNB, NBVAL, NNS,
189     $                   NSVAL, THRESH, TSTERR, A, LA, AFAC, LAFAC, B,
190     $                   X, XACT, WORK, RWORK, IWORK, NOUT )
191*
192*  -- LAPACK test routine --
193*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
194*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
195*
196*     .. Scalar Arguments ..
197      LOGICAL            TSTERR
198      INTEGER            LA, LAFAC, NM, NN, NNB, NNS, NOUT
199      DOUBLE PRECISION   THRESH
200*     ..
201*     .. Array Arguments ..
202      LOGICAL            DOTYPE( * )
203      INTEGER            IWORK( * ), MVAL( * ), NBVAL( * ), NSVAL( * ),
204     $                   NVAL( * )
205      DOUBLE PRECISION   RWORK( * )
206      COMPLEX*16         A( * ), AFAC( * ), B( * ), WORK( * ), X( * ),
207     $                   XACT( * )
208*     ..
209*
210*  =====================================================================
211*
212*     .. Parameters ..
213      DOUBLE PRECISION   ONE, ZERO
214      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
215      INTEGER            NTYPES, NTESTS
216      PARAMETER          ( NTYPES = 8, NTESTS = 7 )
217      INTEGER            NBW, NTRAN
218      PARAMETER          ( NBW = 4, NTRAN = 3 )
219*     ..
220*     .. Local Scalars ..
221      LOGICAL            TRFCON, ZEROT
222      CHARACTER          DIST, NORM, TRANS, TYPE, XTYPE
223      CHARACTER*3        PATH
224      INTEGER            I, I1, I2, IKL, IKU, IM, IMAT, IN, INB, INFO,
225     $                   IOFF, IRHS, ITRAN, IZERO, J, K, KL, KOFF, KU,
226     $                   LDA, LDAFAC, LDB, M, MODE, N, NB, NERRS, NFAIL,
227     $                   NIMAT, NKL, NKU, NRHS, NRUN
228      DOUBLE PRECISION   AINVNM, ANORM, ANORMI, ANORMO, CNDNUM, RCOND,
229     $                   RCONDC, RCONDI, RCONDO
230*     ..
231*     .. Local Arrays ..
232      CHARACTER          TRANSS( NTRAN )
233      INTEGER            ISEED( 4 ), ISEEDY( 4 ), KLVAL( NBW ),
234     $                   KUVAL( NBW )
235      DOUBLE PRECISION   RESULT( NTESTS )
236*     ..
237*     .. External Functions ..
238      DOUBLE PRECISION   DGET06, ZLANGB, ZLANGE
239      EXTERNAL           DGET06, ZLANGB, ZLANGE
240*     ..
241*     .. External Subroutines ..
242      EXTERNAL           ALAERH, ALAHD, ALASUM, XLAENV, ZCOPY, ZERRGE,
243     $                   ZGBCON, ZGBRFS, ZGBT01, ZGBT02, ZGBT05, ZGBTRF,
244     $                   ZGBTRS, ZGET04, ZLACPY, ZLARHS, ZLASET, ZLATB4,
245     $                   ZLATMS
246*     ..
247*     .. Intrinsic Functions ..
248      INTRINSIC          DCMPLX, MAX, MIN
249*     ..
250*     .. Scalars in Common ..
251      LOGICAL            LERR, OK
252      CHARACTER*32       SRNAMT
253      INTEGER            INFOT, NUNIT
254*     ..
255*     .. Common blocks ..
256      COMMON             / INFOC / INFOT, NUNIT, OK, LERR
257      COMMON             / SRNAMC / SRNAMT
258*     ..
259*     .. Data statements ..
260      DATA               ISEEDY / 1988, 1989, 1990, 1991 / ,
261     $                   TRANSS / 'N', 'T', 'C' /
262*     ..
263*     .. Executable Statements ..
264*
265*     Initialize constants and the random number seed.
266*
267      PATH( 1: 1 ) = 'Zomplex precision'
268      PATH( 2: 3 ) = 'GB'
269      NRUN = 0
270      NFAIL = 0
271      NERRS = 0
272      DO 10 I = 1, 4
273         ISEED( I ) = ISEEDY( I )
274   10 CONTINUE
275*
276*     Test the error exits
277*
278      IF( TSTERR )
279     $   CALL ZERRGE( PATH, NOUT )
280      INFOT = 0
281*
282*     Initialize the first value for the lower and upper bandwidths.
283*
284      KLVAL( 1 ) = 0
285      KUVAL( 1 ) = 0
286*
287*     Do for each value of M in MVAL
288*
289      DO 160 IM = 1, NM
290         M = MVAL( IM )
291*
292*        Set values to use for the lower bandwidth.
293*
294         KLVAL( 2 ) = M + ( M+1 ) / 4
295*
296*        KLVAL( 2 ) = MAX( M-1, 0 )
297*
298         KLVAL( 3 ) = ( 3*M-1 ) / 4
299         KLVAL( 4 ) = ( M+1 ) / 4
300*
301*        Do for each value of N in NVAL
302*
303         DO 150 IN = 1, NN
304            N = NVAL( IN )
305            XTYPE = 'N'
306*
307*           Set values to use for the upper bandwidth.
308*
309            KUVAL( 2 ) = N + ( N+1 ) / 4
310*
311*           KUVAL( 2 ) = MAX( N-1, 0 )
312*
313            KUVAL( 3 ) = ( 3*N-1 ) / 4
314            KUVAL( 4 ) = ( N+1 ) / 4
315*
316*           Set limits on the number of loop iterations.
317*
318            NKL = MIN( M+1, 4 )
319            IF( N.EQ.0 )
320     $         NKL = 2
321            NKU = MIN( N+1, 4 )
322            IF( M.EQ.0 )
323     $         NKU = 2
324            NIMAT = NTYPES
325            IF( M.LE.0 .OR. N.LE.0 )
326     $         NIMAT = 1
327*
328            DO 140 IKL = 1, NKL
329*
330*              Do for KL = 0, (5*M+1)/4, (3M-1)/4, and (M+1)/4. This
331*              order makes it easier to skip redundant values for small
332*              values of M.
333*
334               KL = KLVAL( IKL )
335               DO 130 IKU = 1, NKU
336*
337*                 Do for KU = 0, (5*N+1)/4, (3N-1)/4, and (N+1)/4. This
338*                 order makes it easier to skip redundant values for
339*                 small values of N.
340*
341                  KU = KUVAL( IKU )
342*
343*                 Check that A and AFAC are big enough to generate this
344*                 matrix.
345*
346                  LDA = KL + KU + 1
347                  LDAFAC = 2*KL + KU + 1
348                  IF( ( LDA*N ).GT.LA .OR. ( LDAFAC*N ).GT.LAFAC ) THEN
349                     IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
350     $                  CALL ALAHD( NOUT, PATH )
351                     IF( N*( KL+KU+1 ).GT.LA ) THEN
352                        WRITE( NOUT, FMT = 9999 )LA, M, N, KL, KU,
353     $                     N*( KL+KU+1 )
354                        NERRS = NERRS + 1
355                     END IF
356                     IF( N*( 2*KL+KU+1 ).GT.LAFAC ) THEN
357                        WRITE( NOUT, FMT = 9998 )LAFAC, M, N, KL, KU,
358     $                     N*( 2*KL+KU+1 )
359                        NERRS = NERRS + 1
360                     END IF
361                     GO TO 130
362                  END IF
363*
364                  DO 120 IMAT = 1, NIMAT
365*
366*                    Do the tests only if DOTYPE( IMAT ) is true.
367*
368                     IF( .NOT.DOTYPE( IMAT ) )
369     $                  GO TO 120
370*
371*                    Skip types 2, 3, or 4 if the matrix size is too
372*                    small.
373*
374                     ZEROT = IMAT.GE.2 .AND. IMAT.LE.4
375                     IF( ZEROT .AND. N.LT.IMAT-1 )
376     $                  GO TO 120
377*
378                     IF( .NOT.ZEROT .OR. .NOT.DOTYPE( 1 ) ) THEN
379*
380*                       Set up parameters with ZLATB4 and generate a
381*                       test matrix with ZLATMS.
382*
383                        CALL ZLATB4( PATH, IMAT, M, N, TYPE, KL, KU,
384     $                               ANORM, MODE, CNDNUM, DIST )
385*
386                        KOFF = MAX( 1, KU+2-N )
387                        DO 20 I = 1, KOFF - 1
388                           A( I ) = ZERO
389   20                   CONTINUE
390                        SRNAMT = 'ZLATMS'
391                        CALL ZLATMS( M, N, DIST, ISEED, TYPE, RWORK,
392     $                               MODE, CNDNUM, ANORM, KL, KU, 'Z',
393     $                               A( KOFF ), LDA, WORK, INFO )
394*
395*                       Check the error code from ZLATMS.
396*
397                        IF( INFO.NE.0 ) THEN
398                           CALL ALAERH( PATH, 'ZLATMS', INFO, 0, ' ', M,
399     $                                  N, KL, KU, -1, IMAT, NFAIL,
400     $                                  NERRS, NOUT )
401                           GO TO 120
402                        END IF
403                     ELSE IF( IZERO.GT.0 ) THEN
404*
405*                       Use the same matrix for types 3 and 4 as for
406*                       type 2 by copying back the zeroed out column.
407*
408                        CALL ZCOPY( I2-I1+1, B, 1, A( IOFF+I1 ), 1 )
409                     END IF
410*
411*                    For types 2, 3, and 4, zero one or more columns of
412*                    the matrix to test that INFO is returned correctly.
413*
414                     IZERO = 0
415                     IF( ZEROT ) THEN
416                        IF( IMAT.EQ.2 ) THEN
417                           IZERO = 1
418                        ELSE IF( IMAT.EQ.3 ) THEN
419                           IZERO = MIN( M, N )
420                        ELSE
421                           IZERO = MIN( M, N ) / 2 + 1
422                        END IF
423                        IOFF = ( IZERO-1 )*LDA
424                        IF( IMAT.LT.4 ) THEN
425*
426*                          Store the column to be zeroed out in B.
427*
428                           I1 = MAX( 1, KU+2-IZERO )
429                           I2 = MIN( KL+KU+1, KU+1+( M-IZERO ) )
430                           CALL ZCOPY( I2-I1+1, A( IOFF+I1 ), 1, B, 1 )
431*
432                           DO 30 I = I1, I2
433                              A( IOFF+I ) = ZERO
434   30                      CONTINUE
435                        ELSE
436                           DO 50 J = IZERO, N
437                              DO 40 I = MAX( 1, KU+2-J ),
438     $                                MIN( KL+KU+1, KU+1+( M-J ) )
439                                 A( IOFF+I ) = ZERO
440   40                         CONTINUE
441                              IOFF = IOFF + LDA
442   50                      CONTINUE
443                        END IF
444                     END IF
445*
446*                    These lines, if used in place of the calls in the
447*                    loop over INB, cause the code to bomb on a Sun
448*                    SPARCstation.
449*
450*                     ANORMO = ZLANGB( 'O', N, KL, KU, A, LDA, RWORK )
451*                     ANORMI = ZLANGB( 'I', N, KL, KU, A, LDA, RWORK )
452*
453*                    Do for each blocksize in NBVAL
454*
455                     DO 110 INB = 1, NNB
456                        NB = NBVAL( INB )
457                        CALL XLAENV( 1, NB )
458*
459*                       Compute the LU factorization of the band matrix.
460*
461                        IF( M.GT.0 .AND. N.GT.0 )
462     $                     CALL ZLACPY( 'Full', KL+KU+1, N, A, LDA,
463     $                                  AFAC( KL+1 ), LDAFAC )
464                        SRNAMT = 'ZGBTRF'
465                        CALL ZGBTRF( M, N, KL, KU, AFAC, LDAFAC, IWORK,
466     $                               INFO )
467*
468*                       Check error code from ZGBTRF.
469*
470                        IF( INFO.NE.IZERO )
471     $                     CALL ALAERH( PATH, 'ZGBTRF', INFO, IZERO,
472     $                                  ' ', M, N, KL, KU, NB, IMAT,
473     $                                  NFAIL, NERRS, NOUT )
474                        TRFCON = .FALSE.
475*
476*+    TEST 1
477*                       Reconstruct matrix from factors and compute
478*                       residual.
479*
480                        CALL ZGBT01( M, N, KL, KU, A, LDA, AFAC, LDAFAC,
481     $                               IWORK, WORK, RESULT( 1 ) )
482*
483*                       Print information about the tests so far that
484*                       did not pass the threshold.
485*
486                        IF( RESULT( 1 ).GE.THRESH ) THEN
487                           IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
488     $                        CALL ALAHD( NOUT, PATH )
489                           WRITE( NOUT, FMT = 9997 )M, N, KL, KU, NB,
490     $                        IMAT, 1, RESULT( 1 )
491                           NFAIL = NFAIL + 1
492                        END IF
493                        NRUN = NRUN + 1
494*
495*                       Skip the remaining tests if this is not the
496*                       first block size or if M .ne. N.
497*
498                        IF( INB.GT.1 .OR. M.NE.N )
499     $                     GO TO 110
500*
501                        ANORMO = ZLANGB( 'O', N, KL, KU, A, LDA, RWORK )
502                        ANORMI = ZLANGB( 'I', N, KL, KU, A, LDA, RWORK )
503*
504                        IF( INFO.EQ.0 ) THEN
505*
506*                          Form the inverse of A so we can get a good
507*                          estimate of CNDNUM = norm(A) * norm(inv(A)).
508*
509                           LDB = MAX( 1, N )
510                           CALL ZLASET( 'Full', N, N, DCMPLX( ZERO ),
511     $                                  DCMPLX( ONE ), WORK, LDB )
512                           SRNAMT = 'ZGBTRS'
513                           CALL ZGBTRS( 'No transpose', N, KL, KU, N,
514     $                                  AFAC, LDAFAC, IWORK, WORK, LDB,
515     $                                  INFO )
516*
517*                          Compute the 1-norm condition number of A.
518*
519                           AINVNM = ZLANGE( 'O', N, N, WORK, LDB,
520     $                              RWORK )
521                           IF( ANORMO.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
522                              RCONDO = ONE
523                           ELSE
524                              RCONDO = ( ONE / ANORMO ) / AINVNM
525                           END IF
526*
527*                          Compute the infinity-norm condition number of
528*                          A.
529*
530                           AINVNM = ZLANGE( 'I', N, N, WORK, LDB,
531     $                              RWORK )
532                           IF( ANORMI.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
533                              RCONDI = ONE
534                           ELSE
535                              RCONDI = ( ONE / ANORMI ) / AINVNM
536                           END IF
537                        ELSE
538*
539*                          Do only the condition estimate if INFO.NE.0.
540*
541                           TRFCON = .TRUE.
542                           RCONDO = ZERO
543                           RCONDI = ZERO
544                        END IF
545*
546*                       Skip the solve tests if the matrix is singular.
547*
548                        IF( TRFCON )
549     $                     GO TO 90
550*
551                        DO 80 IRHS = 1, NNS
552                           NRHS = NSVAL( IRHS )
553                           XTYPE = 'N'
554*
555                           DO 70 ITRAN = 1, NTRAN
556                              TRANS = TRANSS( ITRAN )
557                              IF( ITRAN.EQ.1 ) THEN
558                                 RCONDC = RCONDO
559                                 NORM = 'O'
560                              ELSE
561                                 RCONDC = RCONDI
562                                 NORM = 'I'
563                              END IF
564*
565*+    TEST 2:
566*                             Solve and compute residual for op(A) * X = B.
567*
568                              SRNAMT = 'ZLARHS'
569                              CALL ZLARHS( PATH, XTYPE, ' ', TRANS, N,
570     $                                     N, KL, KU, NRHS, A, LDA,
571     $                                     XACT, LDB, B, LDB, ISEED,
572     $                                     INFO )
573                              XTYPE = 'C'
574                              CALL ZLACPY( 'Full', N, NRHS, B, LDB, X,
575     $                                     LDB )
576*
577                              SRNAMT = 'ZGBTRS'
578                              CALL ZGBTRS( TRANS, N, KL, KU, NRHS, AFAC,
579     $                                     LDAFAC, IWORK, X, LDB, INFO )
580*
581*                             Check error code from ZGBTRS.
582*
583                              IF( INFO.NE.0 )
584     $                           CALL ALAERH( PATH, 'ZGBTRS', INFO, 0,
585     $                                        TRANS, N, N, KL, KU, -1,
586     $                                        IMAT, NFAIL, NERRS, NOUT )
587*
588                              CALL ZLACPY( 'Full', N, NRHS, B, LDB,
589     $                                     WORK, LDB )
590                              CALL ZGBT02( TRANS, M, N, KL, KU, NRHS, A,
591     $                                     LDA, X, LDB, WORK, LDB,
592     $                                     RWORK, RESULT( 2 ) )
593*
594*+    TEST 3:
595*                             Check solution from generated exact
596*                             solution.
597*
598                              CALL ZGET04( N, NRHS, X, LDB, XACT, LDB,
599     $                                     RCONDC, RESULT( 3 ) )
600*
601*+    TESTS 4, 5, 6:
602*                             Use iterative refinement to improve the
603*                             solution.
604*
605                              SRNAMT = 'ZGBRFS'
606                              CALL ZGBRFS( TRANS, N, KL, KU, NRHS, A,
607     $                                     LDA, AFAC, LDAFAC, IWORK, B,
608     $                                     LDB, X, LDB, RWORK,
609     $                                     RWORK( NRHS+1 ), WORK,
610     $                                     RWORK( 2*NRHS+1 ), INFO )
611*
612*                             Check error code from ZGBRFS.
613*
614                              IF( INFO.NE.0 )
615     $                           CALL ALAERH( PATH, 'ZGBRFS', INFO, 0,
616     $                                        TRANS, N, N, KL, KU, NRHS,
617     $                                        IMAT, NFAIL, NERRS, NOUT )
618*
619                              CALL ZGET04( N, NRHS, X, LDB, XACT, LDB,
620     $                                     RCONDC, RESULT( 4 ) )
621                              CALL ZGBT05( TRANS, N, KL, KU, NRHS, A,
622     $                                     LDA, B, LDB, X, LDB, XACT,
623     $                                     LDB, RWORK, RWORK( NRHS+1 ),
624     $                                     RESULT( 5 ) )
625*
626*                             Print information about the tests that did
627*                             not pass the threshold.
628*
629                              DO 60 K = 2, 6
630                                 IF( RESULT( K ).GE.THRESH ) THEN
631                                    IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
632     $                                 CALL ALAHD( NOUT, PATH )
633                                    WRITE( NOUT, FMT = 9996 )TRANS, N,
634     $                                 KL, KU, NRHS, IMAT, K,
635     $                                 RESULT( K )
636                                    NFAIL = NFAIL + 1
637                                 END IF
638   60                         CONTINUE
639                              NRUN = NRUN + 5
640   70                      CONTINUE
641   80                   CONTINUE
642*
643*+    TEST 7:
644*                          Get an estimate of RCOND = 1/CNDNUM.
645*
646   90                   CONTINUE
647                        DO 100 ITRAN = 1, 2
648                           IF( ITRAN.EQ.1 ) THEN
649                              ANORM = ANORMO
650                              RCONDC = RCONDO
651                              NORM = 'O'
652                           ELSE
653                              ANORM = ANORMI
654                              RCONDC = RCONDI
655                              NORM = 'I'
656                           END IF
657                           SRNAMT = 'ZGBCON'
658                           CALL ZGBCON( NORM, N, KL, KU, AFAC, LDAFAC,
659     $                                  IWORK, ANORM, RCOND, WORK,
660     $                                  RWORK, INFO )
661*
662*                             Check error code from ZGBCON.
663*
664                           IF( INFO.NE.0 )
665     $                        CALL ALAERH( PATH, 'ZGBCON', INFO, 0,
666     $                                     NORM, N, N, KL, KU, -1, IMAT,
667     $                                     NFAIL, NERRS, NOUT )
668*
669                           RESULT( 7 ) = DGET06( RCOND, RCONDC )
670*
671*                          Print information about the tests that did
672*                          not pass the threshold.
673*
674                           IF( RESULT( 7 ).GE.THRESH ) THEN
675                              IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
676     $                           CALL ALAHD( NOUT, PATH )
677                              WRITE( NOUT, FMT = 9995 )NORM, N, KL, KU,
678     $                           IMAT, 7, RESULT( 7 )
679                              NFAIL = NFAIL + 1
680                           END IF
681                           NRUN = NRUN + 1
682  100                   CONTINUE
683  110                CONTINUE
684  120             CONTINUE
685  130          CONTINUE
686  140       CONTINUE
687  150    CONTINUE
688  160 CONTINUE
689*
690*     Print a summary of the results.
691*
692      CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS )
693*
694 9999 FORMAT( ' *** In ZCHKGB, LA=', I5, ' is too small for M=', I5,
695     $      ', N=', I5, ', KL=', I4, ', KU=', I4,
696     $      / ' ==> Increase LA to at least ', I5 )
697 9998 FORMAT( ' *** In ZCHKGB, LAFAC=', I5, ' is too small for M=', I5,
698     $      ', N=', I5, ', KL=', I4, ', KU=', I4,
699     $      / ' ==> Increase LAFAC to at least ', I5 )
700 9997 FORMAT( ' M =', I5, ', N =', I5, ', KL=', I5, ', KU=', I5,
701     $      ', NB =', I4, ', type ', I1, ', test(', I1, ')=', G12.5 )
702 9996 FORMAT( ' TRANS=''', A1, ''', N=', I5, ', KL=', I5, ', KU=', I5,
703     $      ', NRHS=', I3, ', type ', I1, ', test(', I1, ')=', G12.5 )
704 9995 FORMAT( ' NORM =''', A1, ''', N=', I5, ', KL=', I5, ', KU=', I5,
705     $      ',', 10X, ' type ', I1, ', test(', I1, ')=', G12.5 )
706*
707      RETURN
708*
709*     End of ZCHKGB
710*
711      END
712