1       SUBROUTINE ZDRVGE( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, NMAX,
  2      $                   A, AFAC, ASAV, B, BSAV, X, XACT, S, WORK,
  3      $                   RWORK, IWORK, NOUT )
  4 *
  5 *  -- LAPACK test routine (version 3.1) --
  6 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
  7 *     November 2006
  8 *
  9 *     .. Scalar Arguments ..
 10       LOGICAL            TSTERR
 11       INTEGER            NMAX, NN, NOUT, NRHS
 12       DOUBLE PRECISION   THRESH
 13 *     ..
 14 *     .. Array Arguments ..
 15       LOGICAL            DOTYPE( * )
 16       INTEGER            IWORK( * ), NVAL( * )
 17       DOUBLE PRECISION   RWORK( * ), S( * )
 18       COMPLEX*16         A( * ), AFAC( * ), ASAV( * ), B( * ),
 19      $                   BSAV( * ), WORK( * ), X( * ), XACT( * )
 20 *     ..
 21 *
 22 *  Purpose
 23 *  =======
 24 *
 25 *  ZDRVGE tests the driver routines ZGESV and -SVX.
 26 *
 27 *  Arguments
 28 *  =========
 29 *
 30 *  DOTYPE  (input) LOGICAL array, dimension (NTYPES)
 31 *          The matrix types to be used for testing.  Matrices of type j
 32 *          (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) =
 33 *          .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used.
 34 *
 35 *  NN      (input) INTEGER
 36 *          The number of values of N contained in the vector NVAL.
 37 *
 38 *  NVAL    (input) INTEGER array, dimension (NN)
 39 *          The values of the matrix column dimension N.
 40 *
 41 *  NRHS    (input) INTEGER
 42 *          The number of right hand side vectors to be generated for
 43 *          each linear system.
 44 *
 45 *  THRESH  (input) DOUBLE PRECISION
 46 *          The threshold value for the test ratios.  A result is
 47 *          included in the output file if RESULT >= THRESH.  To have
 48 *          every test ratio printed, use THRESH = 0.
 49 *
 50 *  TSTERR  (input) LOGICAL
 51 *          Flag that indicates whether error exits are to be tested.
 52 *
 53 *  NMAX    (input) INTEGER
 54 *          The maximum value permitted for N, used in dimensioning the
 55 *          work arrays.
 56 *
 57 *  A       (workspace) COMPLEX*16 array, dimension (NMAX*NMAX)
 58 *
 59 *  AFAC    (workspace) COMPLEX*16 array, dimension (NMAX*NMAX)
 60 *
 61 *  ASAV    (workspace) COMPLEX*16 array, dimension (NMAX*NMAX)
 62 *
 63 *  B       (workspace) COMPLEX*16 array, dimension (NMAX*NRHS)
 64 *
 65 *  BSAV    (workspace) COMPLEX*16 array, dimension (NMAX*NRHS)
 66 *
 67 *  X       (workspace) COMPLEX*16 array, dimension (NMAX*NRHS)
 68 *
 69 *  XACT    (workspace) COMPLEX*16 array, dimension (NMAX*NRHS)
 70 *
 71 *  S       (workspace) DOUBLE PRECISION array, dimension (2*NMAX)
 72 *
 73 *  WORK    (workspace) COMPLEX*16 array, dimension
 74 *                      (NMAX*max(3,NRHS))
 75 *
 76 *  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*NRHS+NMAX)
 77 *
 78 *  IWORK   (workspace) INTEGER array, dimension (NMAX)
 79 *
 80 *  NOUT    (input) INTEGER
 81 *          The unit number for output.
 82 *
 83 *  =====================================================================
 84 *
 85 *     .. Parameters ..
 86       DOUBLE PRECISION   ONE, ZERO
 87       PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
 88       INTEGER            NTYPES
 89       PARAMETER          ( NTYPES = 11 )
 90       INTEGER            NTESTS
 91       PARAMETER          ( NTESTS = 7 )
 92       INTEGER            NTRAN
 93       PARAMETER          ( NTRAN = 3 )
 94 *     ..
 95 *     .. Local Scalars ..
 96       LOGICAL            EQUIL, NOFACT, PREFAC, TRFCON, ZEROT
 97       CHARACTER          DIST, EQUED, FACT, TRANS, TYPE, XTYPE
 98       CHARACTER*3        PATH
 99       INTEGER            I, IEQUED, IFACT, IMAT, IN, INFO, IOFF, ITRAN,
100      $                   IZERO, K, K1, KL, KU, LDA, LWORK, MODE, N, NB,
101      $                   NBMIN, NERRS, NFACT, NFAIL, NIMAT, NRUN, NT
102       DOUBLE PRECISION   AINVNM, AMAX, ANORM, ANORMI, ANORMO, CNDNUM,
103      $                   COLCND, RCOND, RCONDC, RCONDI, RCONDO, ROLDC,
104      $                   ROLDI, ROLDO, ROWCND, RPVGRW
105 *     ..
106 *     .. Local Arrays ..
107       CHARACTER          EQUEDS( 4 ), FACTS( 3 ), TRANSS( NTRAN )
108       INTEGER            ISEED( 4 ), ISEEDY( 4 )
109       DOUBLE PRECISION   RDUM( 1 ), RESULT( NTESTS )
110 *     ..
111 *     .. External Functions ..
112       LOGICAL            LSAME
113       DOUBLE PRECISION   DGET06, DLAMCH, ZLANGE, ZLANTR
114       EXTERNAL           LSAME, DGET06, DLAMCH, ZLANGE, ZLANTR
115 *     ..
116 *     .. External Subroutines ..
117       EXTERNAL           ALADHD, ALAERH, ALASVM, XLAENV, ZERRVX, ZGEEQU,
118      $                   ZGESV, ZGESVX, ZGET01, ZGET02, ZGET04, ZGET07,
119      $                   ZGETRF, ZGETRI, ZLACPY, ZLAQGE, ZLARHS, ZLASET,
120      $                   ZLATB4, ZLATMS
121 *     ..
122 *     .. Intrinsic Functions ..
123       INTRINSIC          ABSDCMPLXMAX
124 *     ..
125 *     .. Scalars in Common ..
126       LOGICAL            LERR, OK
127       CHARACTER*32       SRNAMT
128       INTEGER            INFOT, NUNIT
129 *     ..
130 *     .. Common blocks ..
131       COMMON             / INFOC / INFOT, NUNIT, OK, LERR
132       COMMON             / SRNAMC / SRNAMT
133 *     ..
134 *     .. Data statements ..
135       DATA               ISEEDY / 1988198919901991 /
136       DATA               TRANSS / 'N''T''C' /
137       DATA               FACTS / 'F''N''E' /
138       DATA               EQUEDS / 'N''R''C''B' /
139 *     ..
140 *     .. Executable Statements ..
141 *
142 *     Initialize constants and the random number seed.
143 *
144       PATH( 11 ) = 'Zomplex precision'
145       PATH( 23 ) = 'GE'
146       NRUN = 0
147       NFAIL = 0
148       NERRS = 0
149       DO 10 I = 14
150          ISEED( I ) = ISEEDY( I )
151    10 CONTINUE
152 *
153 *     Test the error exits
154 *
155       IF( TSTERR )
156      $   CALL ZERRVX( PATH, NOUT )
157       INFOT = 0
158 *
159 *     Set the block size and minimum block size for testing.
160 *
161       NB = 1
162       NBMIN = 2
163       CALL XLAENV( 1, NB )
164       CALL XLAENV( 2, NBMIN )
165 *
166 *     Do for each value of N in NVAL
167 *
168       DO 90 IN = 1, NN
169          N = NVAL( IN )
170          LDA = MAX( N, 1 )
171          XTYPE = 'N'
172          NIMAT = NTYPES
173          IF( N.LE.0 )
174      $      NIMAT = 1
175 *
176          DO 80 IMAT = 1, NIMAT
177 *
178 *           Do the tests only if DOTYPE( IMAT ) is true.
179 *
180             IF.NOT.DOTYPE( IMAT ) )
181      $         GO TO 80
182 *
183 *           Skip types 5, 6, or 7 if the matrix size is too small.
184 *
185             ZEROT = IMAT.GE.5 .AND. IMAT.LE.7
186             IF( ZEROT .AND. N.LT.IMAT-4 )
187      $         GO TO 80
188 *
189 *           Set up parameters with ZLATB4 and generate a test matrix
190 *           with ZLATMS.
191 *
192             CALL ZLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE,
193      $                   CNDNUM, DIST )
194             RCONDC = ONE / CNDNUM
195 *
196             SRNAMT = 'ZLATMS'
197             CALL ZLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE, CNDNUM,
198      $                   ANORM, KL, KU, 'No packing', A, LDA, WORK,
199      $                   INFO )
200 *
201 *           Check error code from ZLATMS.
202 *
203             IF( INFO.NE.0 ) THEN
204                CALL ALAERH( PATH, 'ZLATMS', INFO, 0' ', N, N, -1-1,
205      $                      -1, IMAT, NFAIL, NERRS, NOUT )
206                GO TO 80
207             END IF
208 *
209 *           For types 5-7, zero one or more columns of the matrix to
210 *           test that INFO is returned correctly.
211 *
212             IF( ZEROT ) THEN
213                IF( IMAT.EQ.5 ) THEN
214                   IZERO = 1
215                ELSE IF( IMAT.EQ.6 ) THEN
216                   IZERO = N
217                ELSE
218                   IZERO = N / 2 + 1
219                END IF
220                IOFF = ( IZERO-1 )*LDA
221                IF( IMAT.LT.7 ) THEN
222                   DO 20 I = 1, N
223                      A( IOFF+I ) = ZERO
224    20             CONTINUE
225                ELSE
226                   CALL ZLASET( 'Full', N, N-IZERO+1DCMPLX( ZERO ),
227      $                         DCMPLX( ZERO ), A( IOFF+1 ), LDA )
228                END IF
229             ELSE
230                IZERO = 0
231             END IF
232 *
233 *           Save a copy of the matrix A in ASAV.
234 *
235             CALL ZLACPY( 'Full', N, N, A, LDA, ASAV, LDA )
236 *
237             DO 70 IEQUED = 14
238                EQUED = EQUEDS( IEQUED )
239                IF( IEQUED.EQ.1 ) THEN
240                   NFACT = 3
241                ELSE
242                   NFACT = 1
243                END IF
244 *
245                DO 60 IFACT = 1, NFACT
246                   FACT = FACTS( IFACT )
247                   PREFAC = LSAME( FACT, 'F' )
248                   NOFACT = LSAME( FACT, 'N' )
249                   EQUIL = LSAME( FACT, 'E' )
250 *
251                   IF( ZEROT ) THEN
252                      IF( PREFAC )
253      $                  GO TO 60
254                      RCONDO = ZERO
255                      RCONDI = ZERO
256 *
257                   ELSE IF.NOT.NOFACT ) THEN
258 *
259 *                    Compute the condition number for comparison with
260 *                    the value returned by ZGESVX (FACT = 'N' reuses
261 *                    the condition number from the previous iteration
262 *                    with FACT = 'F').
263 *
264                      CALL ZLACPY( 'Full', N, N, ASAV, LDA, AFAC, LDA )
265                      IF( EQUIL .OR. IEQUED.GT.1 ) THEN
266 *
267 *                       Compute row and column scale factors to
268 *                       equilibrate the matrix A.
269 *
270                         CALL ZGEEQU( N, N, AFAC, LDA, S, S( N+1 ),
271      $                               ROWCND, COLCND, AMAX, INFO )
272                         IF( INFO.EQ.0 .AND. N.GT.0 ) THEN
273                            IF( LSAME( EQUED, 'R' ) ) THEN
274                               ROWCND = ZERO
275                               COLCND = ONE
276                            ELSE IF( LSAME( EQUED, 'C' ) ) THEN
277                               ROWCND = ONE
278                               COLCND = ZERO
279                            ELSE IF( LSAME( EQUED, 'B' ) ) THEN
280                               ROWCND = ZERO
281                               COLCND = ZERO
282                            END IF
283 *
284 *                          Equilibrate the matrix.
285 *
286                            CALL ZLAQGE( N, N, AFAC, LDA, S, S( N+1 ),
287      $                                  ROWCND, COLCND, AMAX, EQUED )
288                         END IF
289                      END IF
290 *
291 *                    Save the condition number of the non-equilibrated
292 *                    system for use in ZGET04.
293 *
294                      IF( EQUIL ) THEN
295                         ROLDO = RCONDO
296                         ROLDI = RCONDI
297                      END IF
298 *
299 *                    Compute the 1-norm and infinity-norm of A.
300 *
301                      ANORMO = ZLANGE( '1', N, N, AFAC, LDA, RWORK )
302                      ANORMI = ZLANGE( 'I', N, N, AFAC, LDA, RWORK )
303 *
304 *                    Factor the matrix A.
305 *
306                      CALL ZGETRF( N, N, AFAC, LDA, IWORK, INFO )
307 *
308 *                    Form the inverse of A.
309 *
310                      CALL ZLACPY( 'Full', N, N, AFAC, LDA, A, LDA )
311                      LWORK = NMAX*MAX3, NRHS )
312                      CALL ZGETRI( N, A, LDA, IWORK, WORK, LWORK, INFO )
313 *
314 *                    Compute the 1-norm condition number of A.
315 *
316                      AINVNM = ZLANGE( '1', N, N, A, LDA, RWORK )
317                      IF( ANORMO.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
318                         RCONDO = ONE
319                      ELSE
320                         RCONDO = ( ONE / ANORMO ) / AINVNM
321                      END IF
322 *
323 *                    Compute the infinity-norm condition number of A.
324 *
325                      AINVNM = ZLANGE( 'I', N, N, A, LDA, RWORK )
326                      IF( ANORMI.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
327                         RCONDI = ONE
328                      ELSE
329                         RCONDI = ( ONE / ANORMI ) / AINVNM
330                      END IF
331                   END IF
332 *
333                   DO 50 ITRAN = 1, NTRAN
334 *
335 *                    Do for each value of TRANS.
336 *
337                      TRANS = TRANSS( ITRAN )
338                      IF( ITRAN.EQ.1 ) THEN
339                         RCONDC = RCONDO
340                      ELSE
341                         RCONDC = RCONDI
342                      END IF
343 *
344 *                    Restore the matrix A.
345 *
346                      CALL ZLACPY( 'Full', N, N, ASAV, LDA, A, LDA )
347 *
348 *                    Form an exact solution and set the right hand side.
349 *
350                      SRNAMT = 'ZLARHS'
351                      CALL ZLARHS( PATH, XTYPE, 'Full', TRANS, N, N, KL,
352      $                            KU, NRHS, A, LDA, XACT, LDA, B, LDA,
353      $                            ISEED, INFO )
354                      XTYPE = 'C'
355                      CALL ZLACPY( 'Full', N, NRHS, B, LDA, BSAV, LDA )
356 *
357                      IF( NOFACT .AND. ITRAN.EQ.1 ) THEN
358 *
359 *                       --- Test ZGESV  ---
360 *
361 *                       Compute the LU factorization of the matrix and
362 *                       solve the system.
363 *
364                         CALL ZLACPY( 'Full', N, N, A, LDA, AFAC, LDA )
365                         CALL ZLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
366 *
367                         SRNAMT = 'ZGESV '
368                         CALL ZGESV( N, NRHS, AFAC, LDA, IWORK, X, LDA,
369      $                              INFO )
370 *
371 *                       Check error code from ZGESV .
372 *
373                         IF( INFO.NE.IZERO )
374      $                     CALL ALAERH( PATH, 'ZGESV ', INFO, IZERO,
375      $                                  ' ', N, N, -1-1, NRHS, IMAT,
376      $                                  NFAIL, NERRS, NOUT )
377 *
378 *                       Reconstruct matrix from factors and compute
379 *                       residual.
380 *
381                         CALL ZGET01( N, N, A, LDA, AFAC, LDA, IWORK,
382      $                               RWORK, RESULT1 ) )
383                         NT = 1
384                         IF( IZERO.EQ.0 ) THEN
385 *
386 *                          Compute residual of the computed solution.
387 *
388                            CALL ZLACPY( 'Full', N, NRHS, B, LDA, WORK,
389      $                                  LDA )
390                            CALL ZGET02( 'No transpose', N, N, NRHS, A,
391      $                                  LDA, X, LDA, WORK, LDA, RWORK,
392      $                                  RESULT2 ) )
393 *
394 *                          Check solution from generated exact solution.
395 *
396                            CALL ZGET04( N, NRHS, X, LDA, XACT, LDA,
397      $                                  RCONDC, RESULT3 ) )
398                            NT = 3
399                         END IF
400 *
401 *                       Print information about the tests that did not
402 *                       pass the threshold.
403 *
404                         DO 30 K = 1, NT
405                            IFRESULT( K ).GE.THRESH ) THEN
406                               IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
407      $                           CALL ALADHD( NOUT, PATH )
408                               WRITE( NOUT, FMT = 9999 )'ZGESV ', N,
409      $                           IMAT, K, RESULT( K )
410                               NFAIL = NFAIL + 1
411                            END IF
412    30                   CONTINUE
413                         NRUN = NRUN + NT
414                      END IF
415 *
416 *                    --- Test ZGESVX ---
417 *
418                      IF.NOT.PREFAC )
419      $                  CALL ZLASET( 'Full', N, N, DCMPLX( ZERO ),
420      $                               DCMPLX( ZERO ), AFAC, LDA )
421                      CALL ZLASET( 'Full', N, NRHS, DCMPLX( ZERO ),
422      $                            DCMPLX( ZERO ), X, LDA )
423                      IF( IEQUED.GT.1 .AND. N.GT.0 ) THEN
424 *
425 *                       Equilibrate the matrix if FACT = 'F' and
426 *                       EQUED = 'R', 'C', or 'B'.
427 *
428                         CALL ZLAQGE( N, N, A, LDA, S, S( N+1 ), ROWCND,
429      $                               COLCND, AMAX, EQUED )
430                      END IF
431 *
432 *                    Solve the system and compute the condition number
433 *                    and error bounds using ZGESVX.
434 *
435                      SRNAMT = 'ZGESVX'
436                      CALL ZGESVX( FACT, TRANS, N, NRHS, A, LDA, AFAC,
437      $                            LDA, IWORK, EQUED, S, S( N+1 ), B,
438      $                            LDA, X, LDA, RCOND, RWORK,
439      $                            RWORK( NRHS+1 ), WORK,
440      $                            RWORK( 2*NRHS+1 ), INFO )
441 *
442 *                    Check the error code from ZGESVX.
443 *
444                      IF( INFO.NE.IZERO )
445      $                  CALL ALAERH( PATH, 'ZGESVX', INFO, IZERO,
446      $                               FACT // TRANS, N, N, -1-1, NRHS,
447      $                               IMAT, NFAIL, NERRS, NOUT )
448 *
449 *                    Compare RWORK(2*NRHS+1) from ZGESVX with the
450 *                    computed reciprocal pivot growth factor RPVGRW
451 *
452                      IF( INFO.NE.0 ) THEN
453                         RPVGRW = ZLANTR( 'M''U''N', INFO, INFO,
454      $                           AFAC, LDA, RDUM )
455                         IF( RPVGRW.EQ.ZERO ) THEN
456                            RPVGRW = ONE
457                         ELSE
458                            RPVGRW = ZLANGE( 'M', N, INFO, A, LDA,
459      $                              RDUM ) / RPVGRW
460                         END IF
461                      ELSE
462                         RPVGRW = ZLANTR( 'M''U''N', N, N, AFAC, LDA,
463      $                           RDUM )
464                         IF( RPVGRW.EQ.ZERO ) THEN
465                            RPVGRW = ONE
466                         ELSE
467                            RPVGRW = ZLANGE( 'M', N, N, A, LDA, RDUM ) /
468      $                              RPVGRW
469                         END IF
470                      END IF
471                      RESULT7 ) = ABS( RPVGRW-RWORK( 2*NRHS+1 ) ) /
472      $                             MAX( RWORK( 2*NRHS+1 ), RPVGRW ) /
473      $                             DLAMCH( 'E' )
474 *
475                      IF.NOT.PREFAC ) THEN
476 *
477 *                       Reconstruct matrix from factors and compute
478 *                       residual.
479 *
480                         CALL ZGET01( N, N, A, LDA, AFAC, LDA, IWORK,
481      $                               RWORK( 2*NRHS+1 ), RESULT1 ) )
482                         K1 = 1
483                      ELSE
484                         K1 = 2
485                      END IF
486 *
487                      IF( INFO.EQ.0 ) THEN
488                         TRFCON = .FALSE.
489 *
490 *                       Compute residual of the computed solution.
491 *
492                         CALL ZLACPY( 'Full', N, NRHS, BSAV, LDA, WORK,
493      $                               LDA )
494                         CALL ZGET02( TRANS, N, N, NRHS, ASAV, LDA, X,
495      $                               LDA, WORK, LDA, RWORK( 2*NRHS+1 ),
496      $                               RESULT2 ) )
497 *
498 *                       Check solution from generated exact solution.
499 *
500                         IF( NOFACT .OR. ( PREFAC .AND. LSAME( EQUED,
501      $                      'N' ) ) ) THEN
502                            CALL ZGET04( N, NRHS, X, LDA, XACT, LDA,
503      $                                  RCONDC, RESULT3 ) )
504                         ELSE
505                            IF( ITRAN.EQ.1 ) THEN
506                               ROLDC = ROLDO
507                            ELSE
508                               ROLDC = ROLDI
509                            END IF
510                            CALL ZGET04( N, NRHS, X, LDA, XACT, LDA,
511      $                                  ROLDC, RESULT3 ) )
512                         END IF
513 *
514 *                       Check the error bounds from iterative
515 *                       refinement.
516 *
517                         CALL ZGET07( TRANS, N, NRHS, ASAV, LDA, B, LDA,
518      $                               X, LDA, XACT, LDA, RWORK, .TRUE.,
519      $                               RWORK( NRHS+1 ), RESULT4 ) )
520                      ELSE
521                         TRFCON = .TRUE.
522                      END IF
523 *
524 *                    Compare RCOND from ZGESVX with the computed value
525 *                    in RCONDC.
526 *
527                      RESULT6 ) = DGET06( RCOND, RCONDC )
528 *
529 *                    Print information about the tests that did not pass
530 *                    the threshold.
531 *
532                      IF.NOT.TRFCON ) THEN
533                         DO 40 K = K1, NTESTS
534                            IFRESULT( K ).GE.THRESH ) THEN
535                               IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
536      $                           CALL ALADHD( NOUT, PATH )
537                               IF( PREFAC ) THEN
538                                  WRITE( NOUT, FMT = 9997 )'ZGESVX',
539      $                              FACT, TRANS, N, EQUED, IMAT, K,
540      $                              RESULT( K )
541                               ELSE
542                                  WRITE( NOUT, FMT = 9998 )'ZGESVX',
543      $                              FACT, TRANS, N, IMAT, K, RESULT( K )
544                               END IF
545                               NFAIL = NFAIL + 1
546                            END IF
547    40                   CONTINUE
548                         NRUN = NRUN + 7 - K1
549                      ELSE
550                         IFRESULT1 ).GE.THRESH .AND. .NOT.PREFAC )
551      $                       THEN
552                            IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
553      $                        CALL ALADHD( NOUT, PATH )
554                            IF( PREFAC ) THEN
555                               WRITE( NOUT, FMT = 9997 )'ZGESVX', FACT,
556      $                           TRANS, N, EQUED, IMAT, 1RESULT1 )
557                            ELSE
558                               WRITE( NOUT, FMT = 9998 )'ZGESVX', FACT,
559      $                           TRANS, N, IMAT, 1RESULT1 )
560                            END IF
561                            NFAIL = NFAIL + 1
562                            NRUN = NRUN + 1
563                         END IF
564                         IFRESULT6 ).GE.THRESH ) THEN
565                            IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
566      $                        CALL ALADHD( NOUT, PATH )
567                            IF( PREFAC ) THEN
568                               WRITE( NOUT, FMT = 9997 )'ZGESVX', FACT,
569      $                           TRANS, N, EQUED, IMAT, 6RESULT6 )
570                            ELSE
571                               WRITE( NOUT, FMT = 9998 )'ZGESVX', FACT,
572      $                           TRANS, N, IMAT, 6RESULT6 )
573                            END IF
574                            NFAIL = NFAIL + 1
575                            NRUN = NRUN + 1
576                         END IF
577                         IFRESULT7 ).GE.THRESH ) THEN
578                            IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
579      $                        CALL ALADHD( NOUT, PATH )
580                            IF( PREFAC ) THEN
581                               WRITE( NOUT, FMT = 9997 )'ZGESVX', FACT,
582      $                           TRANS, N, EQUED, IMAT, 7RESULT7 )
583                            ELSE
584                               WRITE( NOUT, FMT = 9998 )'ZGESVX', FACT,
585      $                           TRANS, N, IMAT, 7RESULT7 )
586                            END IF
587                            NFAIL = NFAIL + 1
588                            NRUN = NRUN + 1
589                         END IF
590 *
591                      END IF
592 *
593    50             CONTINUE
594    60          CONTINUE
595    70       CONTINUE
596    80    CONTINUE
597    90 CONTINUE
598 *
599 *     Print a summary of the results.
600 *
601       CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
602 *
603  9999 FORMAT1X, A, ', N =', I5, ', type ', I2, ', test(', I2, ') =',
604      $      G12.5 )
605  9998 FORMAT1X, A, ', FACT=''', A1, ''', TRANS=''', A1, ''', N=', I5,
606      $      ', type ', I2, ', test(', I1, ')='G12.5 )
607  9997 FORMAT1X, A, ', FACT=''', A1, ''', TRANS=''', A1, ''', N=', I5,
608      $      ', EQUED=''', A1, ''', type ', I2, ', test(', I1, ')=',
609      $      G12.5 )
610       RETURN
611 *
612 *     End of ZDRVGE
613 *
614       END