397      SUBROUTINE zdrvbd( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
 
  398     $                   A, LDA, U, LDU, VT, LDVT, ASAV, USAV, VTSAV, S,
 
  399     $                   SSAV, E, WORK, LWORK, RWORK, IWORK, NOUNIT,
 
  409      INTEGER            INFO, LDA, LDU, LDVT, LWORK, NOUNIT, NSIZES,
 
  411      DOUBLE PRECISION   THRESH
 
  415      INTEGER            ISEED( 4 ), IWORK( * ), MM( * ), NN( * )
 
  416      DOUBLE PRECISION   E( * ), RWORK( * ), S( * ), SSAV( * )
 
  417      COMPLEX*16         A( LDA, * ), ASAV( LDA, * ), U( LDU, * ),
 
  418     $                   usav( ldu, * ), vt( ldvt, * ),
 
  419     $                   vtsav( ldvt, * ), work( * )
 
  425      DOUBLE PRECISION   ZERO, ONE, TWO, HALF
 
  426      PARAMETER          ( ZERO = 0.0d0, one = 1.0d0, two = 2.0d0,
 
  428      COMPLEX*16         CZERO, CONE
 
  429      parameter( czero = ( 0.0d+0, 0.0d+0 ),
 
  430     $                   cone = ( 1.0d+0, 0.0d+0 ) )
 
  432      parameter( maxtyp = 5 )
 
  436      CHARACTER          JOBQ, JOBU, JOBVT, RANGE
 
  437      INTEGER            I, IINFO, IJQ, IJU, IJVT, IL, IU, ITEMP,
 
  438     $                   iwspc, iwtmp, j, jsize, jtype, lswork, m,
 
  439     $                   minwrk, mmax, mnmax, mnmin, mtypes, n,
 
  440     $                   nerrs, nfail, nmax, ns, nsi, nsv, ntest,
 
  441     $                   ntestf, ntestt, lrwork
 
  442      DOUBLE PRECISION   ANORM, DIF, DIV, OVFL, RTUNFL, ULP, ULPINV,
 
  446      INTEGER            LIWORK, NUMRANK
 
  449      CHARACTER          CJOB( 4 ), CJOBR( 3 ), CJOBV( 2 )
 
  450      INTEGER            IOLDSD( 4 ), ISEED2( 4 )
 
  451      DOUBLE PRECISION   RESULT( 39 )
 
  454      DOUBLE PRECISION   DLAMCH, DLARND
 
  455      EXTERNAL           DLAMCH, DLARND
 
  463      INTRINSIC          abs, dble, max, min
 
  469      COMMON             / srnamc / srnamt
 
  472      DATA               cjob / 
'N', 
'O', 
'S', 
'A' /
 
  473      DATA               cjobr / 
'A', 
'V', 
'I' /
 
  474      DATA               cjobv / 
'N', 
'V' /
 
  494         mmax = max( mmax, mm( j ) )
 
  497         nmax = max( nmax, nn( j ) )
 
  500         mnmax = max( mnmax, min( mm( j ), nn( j ) ) )
 
  501         minwrk = max( minwrk, max( 3*min( mm( j ),
 
  502     $            nn( j ) )+max( mm( j ), nn( j ) )**2, 5*min( mm( j ),
 
  503     $            nn( j ) ), 3*max( mm( j ), nn( j ) ) ) )
 
  508      IF( nsizes.LT.0 ) 
THEN 
  510      ELSE IF( badmm ) 
THEN 
  512      ELSE IF( badnn ) 
THEN 
  514      ELSE IF( ntypes.LT.0 ) 
THEN 
  516      ELSE IF( lda.LT.max( 1, mmax ) ) 
THEN 
  518      ELSE IF( ldu.LT.max( 1, mmax ) ) 
THEN 
  520      ELSE IF( ldvt.LT.max( 1, nmax ) ) 
THEN 
  522      ELSE IF( minwrk.GT.lwork ) 
THEN 
  527         CALL xerbla( 
'ZDRVBD', -info )
 
  533      IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
 
  542      rtunfl = sqrt( unfl )
 
  548      DO 230 jsize = 1, nsizes
 
  553         IF( nsizes.NE.1 ) 
THEN 
  554            mtypes = min( maxtyp, ntypes )
 
  556            mtypes = min( maxtyp+1, ntypes )
 
  559         DO 220 jtype = 1, mtypes
 
  560            IF( .NOT.dotype( jtype ) )
 
  565               ioldsd( j ) = iseed( j )
 
  570            IF( mtypes.GT.maxtyp )
 
  573            IF( jtype.EQ.1 ) 
THEN 
  577               CALL zlaset( 
'Full', m, n, czero, czero, a, lda )
 
  578               DO 30 i = 1, min( m, n )
 
  582            ELSE IF( jtype.EQ.2 ) 
THEN 
  586               CALL zlaset( 
'Full', m, n, czero, cone, a, lda )
 
  587               DO 40 i = 1, min( m, n )
 
  601               CALL zlatms( m, n, 
'U', iseed, 
'N', s, 4, dble( mnmin ),
 
  602     $                      anorm, m-1, n-1, 
'N', a, lda, work, iinfo )
 
  603               IF( iinfo.NE.0 ) 
THEN 
  604                  WRITE( nounit, fmt = 9996 )
'Generator', iinfo, m, n,
 
  612            CALL zlacpy( 
'F', m, n, a, lda, asav, lda )
 
  620               iwtmp = 2*min( m, n )+max( m, n )
 
  621               lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
 
  622               lswork = min( lswork, lwork )
 
  623               lswork = max( lswork, 1 )
 
  634     $            
CALL zlacpy( 
'F', m, n, asav, lda, a, lda )
 
  636               CALL zgesvd( 
'A', 
'A', m, n, a, lda, ssav, usav, ldu,
 
  637     $                      vtsav, ldvt, work, lswork, rwork, iinfo )
 
  638               IF( iinfo.NE.0 ) 
THEN 
  639                  WRITE( nounit, fmt = 9995 )
'GESVD', iinfo, m, n,
 
  640     $               jtype, lswork, ioldsd
 
  647               CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
 
  648     $                      vtsav, ldvt, work, rwork, result( 1 ) )
 
  649               IF( m.NE.0 .AND. n.NE.0 ) 
THEN 
  650                  CALL zunt01( 
'Columns', mnmin, m, usav, ldu, work,
 
  651     $                         lwork, rwork, result( 2 ) )
 
  652                  CALL zunt01( 
'Rows', mnmin, n, vtsav, ldvt, work,
 
  653     $                         lwork, rwork, result( 3 ) )
 
  656               DO 70 i = 1, mnmin - 1
 
  657                  IF( ssav( i ).LT.ssav( i+1 ) )
 
  658     $               result( 4 ) = ulpinv
 
  659                  IF( ssav( i ).LT.zero )
 
  660     $               result( 4 ) = ulpinv
 
  662               IF( mnmin.GE.1 ) 
THEN 
  663                  IF( ssav( mnmin ).LT.zero )
 
  664     $               result( 4 ) = ulpinv
 
  674                     IF( ( iju.EQ.3 .AND. ijvt.EQ.3 ) .OR.
 
  675     $                   ( iju.EQ.1 .AND. ijvt.EQ.1 ) )
GO TO 90
 
  677                     jobvt = cjob( ijvt+1 )
 
  678                     CALL zlacpy( 
'F', m, n, asav, lda, a, lda )
 
  680                     CALL zgesvd( jobu, jobvt, m, n, a, lda, s, u, ldu,
 
  681     $                            vt, ldvt, work, lswork, rwork, iinfo )
 
  686                     IF( m.GT.0 .AND. n.GT.0 ) 
THEN 
  688                           CALL zunt03( 
'C', m, mnmin, m, mnmin, usav,
 
  689     $                                  ldu, a, lda, work, lwork, rwork,
 
  691                        ELSE IF( iju.EQ.2 ) 
THEN 
  692                           CALL zunt03( 
'C', m, mnmin, m, mnmin, usav,
 
  693     $                                  ldu, u, ldu, work, lwork, rwork,
 
  695                        ELSE IF( iju.EQ.3 ) 
THEN 
  696                           CALL zunt03( 
'C', m, m, m, mnmin, usav, ldu,
 
  697     $                                  u, ldu, work, lwork, rwork, dif,
 
  701                     result( 5 ) = max( result( 5 ), dif )
 
  706                     IF( m.GT.0 .AND. n.GT.0 ) 
THEN 
  708                           CALL zunt03( 
'R', n, mnmin, n, mnmin, vtsav,
 
  709     $                                  ldvt, a, lda, work, lwork,
 
  710     $                                  rwork, dif, iinfo )
 
  711                        ELSE IF( ijvt.EQ.2 ) 
THEN 
  712                           CALL zunt03( 
'R', n, mnmin, n, mnmin, vtsav,
 
  713     $                                  ldvt, vt, ldvt, work, lwork,
 
  714     $                                  rwork, dif, iinfo )
 
  715                        ELSE IF( ijvt.EQ.3 ) 
THEN 
  716                           CALL zunt03( 
'R', n, n, n, mnmin, vtsav,
 
  717     $                                  ldvt, vt, ldvt, work, lwork,
 
  718     $                                  rwork, dif, iinfo )
 
  721                     result( 6 ) = max( result( 6 ), dif )
 
  726                     div = max( dble( mnmin )*ulp*s( 1 ),
 
  727     $                     dlamch( 
'Safe minimum' ) )
 
  728                     DO 80 i = 1, mnmin - 1
 
  729                        IF( ssav( i ).LT.ssav( i+1 ) )
 
  731                        IF( ssav( i ).LT.zero )
 
  733                        dif = max( dif, abs( ssav( i )-s( i ) ) / div )
 
  735                     result( 7 ) = max( result( 7 ), dif )
 
  741               iwtmp = 2*mnmin*mnmin + 2*mnmin + max( m, n )
 
  742               lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
 
  743               lswork = min( lswork, lwork )
 
  744               lswork = max( lswork, 1 )
 
  750               CALL zlacpy( 
'F', m, n, asav, lda, a, lda )
 
  752               CALL zgesdd( 
'A', m, n, a, lda, ssav, usav, ldu, vtsav,
 
  753     $                      ldvt, work, lswork, rwork, iwork, iinfo )
 
  754               IF( iinfo.NE.0 ) 
THEN 
  755                  WRITE( nounit, fmt = 9995 )
'GESDD', iinfo, m, n,
 
  756     $               jtype, lswork, ioldsd
 
  763               CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
 
  764     $                      vtsav, ldvt, work, rwork, result( 8 ) )
 
  765               IF( m.NE.0 .AND. n.NE.0 ) 
THEN 
  766                  CALL zunt01( 
'Columns', mnmin, m, usav, ldu, work,
 
  767     $                         lwork, rwork, result( 9 ) )
 
  768                  CALL zunt01( 
'Rows', mnmin, n, vtsav, ldvt, work,
 
  769     $                         lwork, rwork, result( 10 ) )
 
  772               DO 110 i = 1, mnmin - 1
 
  773                  IF( ssav( i ).LT.ssav( i+1 ) )
 
  774     $               result( 11 ) = ulpinv
 
  775                  IF( ssav( i ).LT.zero )
 
  776     $               result( 11 ) = ulpinv
 
  778               IF( mnmin.GE.1 ) 
THEN 
  779                  IF( ssav( mnmin ).LT.zero )
 
  780     $               result( 11 ) = ulpinv
 
  790                  CALL zlacpy( 
'F', m, n, asav, lda, a, lda )
 
  792                  CALL zgesdd( jobq, m, n, a, lda, s, u, ldu, vt, ldvt,
 
  793     $                         work, lswork, rwork, iwork, iinfo )
 
  798                  IF( m.GT.0 .AND. n.GT.0 ) 
THEN 
  801                           CALL zunt03( 
'C', m, mnmin, m, mnmin, usav,
 
  802     $                                  ldu, a, lda, work, lwork, rwork,
 
  805                           CALL zunt03( 
'C', m, mnmin, m, mnmin, usav,
 
  806     $                                  ldu, u, ldu, work, lwork, rwork,
 
  809                     ELSE IF( ijq.EQ.2 ) 
THEN 
  810                        CALL zunt03( 
'C', m, mnmin, m, mnmin, usav, ldu,
 
  811     $                               u, ldu, work, lwork, rwork, dif,
 
  815                  result( 12 ) = max( result( 12 ), dif )
 
  820                  IF( m.GT.0 .AND. n.GT.0 ) 
THEN 
  823                           CALL zunt03( 
'R', n, mnmin, n, mnmin, vtsav,
 
  824     $                                  ldvt, vt, ldvt, work, lwork,
 
  825     $                                  rwork, dif, iinfo )
 
  827                           CALL zunt03( 
'R', n, mnmin, n, mnmin, vtsav,
 
  828     $                                  ldvt, a, lda, work, lwork,
 
  829     $                                  rwork, dif, iinfo )
 
  831                     ELSE IF( ijq.EQ.2 ) 
THEN 
  832                        CALL zunt03( 
'R', n, mnmin, n, mnmin, vtsav,
 
  833     $                               ldvt, vt, ldvt, work, lwork, rwork,
 
  837                  result( 13 ) = max( result( 13 ), dif )
 
  842                  div = max( dble( mnmin )*ulp*s( 1 ),
 
  843     $                  dlamch( 
'Safe minimum' ) )
 
  844                  DO 120 i = 1, mnmin - 1
 
  845                     IF( ssav( i ).LT.ssav( i+1 ) )
 
  847                     IF( ssav( i ).LT.zero )
 
  849                     dif = max( dif, abs( ssav( i )-s( i ) ) / div )
 
  851                  result( 14 ) = max( result( 14 ), dif )
 
  863                  iwtmp = 2*mnmin*mnmin + 2*mnmin + max( m, n )
 
  864                  lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
 
  865                  lswork = min( lswork, lwork )
 
  866                  lswork = max( lswork, 1 )
 
  870                  CALL zlacpy( 
'F', m, n, asav, lda, a, lda )
 
  873                  lrwork = max(2, m, 5*n)
 
  875                  CALL zgesvdq( 
'H', 
'N', 
'N', 
'A', 
'A', 
 
  876     $                          m, n, a, lda, ssav, usav, ldu,
 
  877     $                          vtsav, ldvt, numrank, iwork, liwork,
 
  878     $                          work, lwork, rwork, lrwork, iinfo )
 
  880                  IF( iinfo.NE.0 ) 
THEN 
  881                     WRITE( nounit, fmt = 9995 )
'ZGESVDQ', iinfo, m, n,
 
  882     $               jtype, lswork, ioldsd
 
  889                  CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
 
  890     $                         vtsav, ldvt, work, rwork, result( 36 ) )
 
  891                  IF( m.NE.0 .AND. n.NE.0 ) 
THEN 
  892                     CALL zunt01( 
'Columns', m, m, usav, ldu, work,
 
  893     $                            lwork, rwork, result( 37 ) )
 
  894                     CALL zunt01( 
'Rows', n, n, vtsav, ldvt, work,
 
  895     $                            lwork, rwork, result( 38 ) )
 
  898                  DO 199 i = 1, mnmin - 1
 
  899                     IF( ssav( i ).LT.ssav( i+1 ) )
 
  900     $                  result( 39 ) = ulpinv
 
  901                     IF( ssav( i ).LT.zero )
 
  902     $                  result( 39 ) = ulpinv
 
  904                  IF( mnmin.GE.1 ) 
THEN 
  905                     IF( ssav( mnmin ).LT.zero )
 
  906     $                  result( 39 ) = ulpinv
 
  919                  iwtmp = 2*mnmin*mnmin + 2*mnmin + max( m, n )
 
  920                  lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
 
  921                  lswork = min( lswork, lwork )
 
  922                  lswork = max( lswork, 1 )
 
  927                  CALL zlacpy( 
'F', m, n, asav, lda, usav, lda )
 
  929                  CALL zgesvj( 
'G', 
'U', 
'V', m, n, usav, lda, ssav,
 
  930     &                        0, a, ldvt, work, lwork, rwork,
 
  937                        vtsav(j,i) = conjg(a(i,j))
 
  941                  IF( iinfo.NE.0 ) 
THEN 
  942                     WRITE( nounit, fmt = 9995 )
'GESVJ', iinfo, m, n,
 
  943     $               jtype, lswork, ioldsd
 
  950                  CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
 
  951     $                         vtsav, ldvt, work, rwork, result( 15 ) )
 
  952                  IF( m.NE.0 .AND. n.NE.0 ) 
THEN 
  953                     CALL zunt01( 
'Columns', m, m, usav, ldu, work,
 
  954     $                            lwork, rwork, result( 16 ) )
 
  955                     CALL zunt01( 
'Rows', n, n, vtsav, ldvt, work,
 
  956     $                            lwork, rwork, result( 17 ) )
 
  959                  DO 131 i = 1, mnmin - 1
 
  960                     IF( ssav( i ).LT.ssav( i+1 ) )
 
  961     $                  result( 18 ) = ulpinv
 
  962                     IF( ssav( i ).LT.zero )
 
  963     $                  result( 18 ) = ulpinv
 
  965                  IF( mnmin.GE.1 ) 
THEN 
  966                     IF( ssav( mnmin ).LT.zero )
 
  967     $                  result( 18 ) = ulpinv
 
  979                  iwtmp = 2*mnmin*mnmin + 2*mnmin + max( m, n )
 
  980                  lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
 
  981                  lswork = min( lswork, lwork )
 
  982                  lswork = max( lswork, 1 )
 
  985                  lrwork = max( 7, n + 2*m)
 
  987                  CALL zlacpy( 
'F', m, n, asav, lda, vtsav, lda )
 
  989                  CALL zgejsv( 
'G', 
'U', 
'V', 
'R', 
'N', 
'N',
 
  990     &                   m, n, vtsav, lda, ssav, usav, ldu, a, ldvt,
 
  991     &                   work, lwork, rwork,
 
  992     &                   lrwork, iwork, iinfo )
 
  998                        vtsav(j,i) = conjg(a(i,j))
 
 1002                  IF( iinfo.NE.0 ) 
THEN 
 1003                     WRITE( nounit, fmt = 9995 )
'GEJSV', iinfo, m, n,
 
 1004     $               jtype, lswork, ioldsd
 
 1011                  CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
 
 1012     $                         vtsav, ldvt, work, rwork, result( 19 ) )
 
 1013                  IF( m.NE.0 .AND. n.NE.0 ) 
THEN 
 1014                     CALL zunt01( 
'Columns', m, m, usav, ldu, work,
 
 1015     $                            lwork, rwork, result( 20 ) )
 
 1016                     CALL zunt01( 
'Rows', n, n, vtsav, ldvt, work,
 
 1017     $                            lwork, rwork, result( 21 ) )
 
 1020                  DO 134 i = 1, mnmin - 1
 
 1021                     IF( ssav( i ).LT.ssav( i+1 ) )
 
 1022     $                  result( 22 ) = ulpinv
 
 1023                     IF( ssav( i ).LT.zero )
 
 1024     $                  result( 22 ) = ulpinv
 
 1026                  IF( mnmin.GE.1 ) 
THEN 
 1027                     IF( ssav( mnmin ).LT.zero )
 
 1028     $                  result( 22 ) = ulpinv
 
 1036               CALL zlacpy( 
'F', m, n, asav, lda, a, lda )
 
 1038               CALL zgesvdx( 
'V', 
'V', 
'A', m, n, a, lda,
 
 1039     $                       vl, vu, il, iu, ns, ssav, usav, ldu,
 
 1040     $                       vtsav, ldvt, work, lwork, rwork,
 
 1042               IF( iinfo.NE.0 ) 
THEN 
 1043                  WRITE( nounit, fmt = 9995 )
'GESVDX', iinfo, m, n,
 
 1044     $               jtype, lswork, ioldsd
 
 1054               CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
 
 1055     $                      vtsav, ldvt, work, rwork, result( 23 ) )
 
 1056               IF( m.NE.0 .AND. n.NE.0 ) 
THEN 
 1057                  CALL zunt01( 
'Columns', mnmin, m, usav, ldu, work,
 
 1058     $                         lwork, rwork, result( 24 ) )
 
 1059                  CALL zunt01( 
'Rows', mnmin, n, vtsav, ldvt, work,
 
 1060     $                         lwork, rwork, result( 25 ) )
 
 1063               DO 140 i = 1, mnmin - 1
 
 1064                  IF( ssav( i ).LT.ssav( i+1 ) )
 
 1065     $               result( 26 ) = ulpinv
 
 1066                  IF( ssav( i ).LT.zero )
 
 1067     $               result( 26 ) = ulpinv
 
 1069               IF( mnmin.GE.1 ) 
THEN 
 1070                  IF( ssav( mnmin ).LT.zero )
 
 1071     $               result( 26 ) = ulpinv
 
 1081                     IF( ( iju.EQ.0 .AND. ijvt.EQ.0 ) .OR.
 
 1082     $                   ( iju.EQ.1 .AND. ijvt.EQ.1 ) ) 
GO TO 160
 
 1083                     jobu = cjobv( iju+1 )
 
 1084                     jobvt = cjobv( ijvt+1 )
 
 1086                     CALL zlacpy( 
'F', m, n, asav, lda, a, lda )
 
 1088                     CALL zgesvdx( jobu, jobvt, 
'A', m, n, a, lda,
 
 1089     $                            vl, vu, il, iu, ns, ssav, u, ldu,
 
 1090     $                            vt, ldvt, work, lwork, rwork,
 
 1096                     IF( m.GT.0 .AND. n.GT.0 ) 
THEN 
 1098                           CALL zunt03( 
'C', m, mnmin, m, mnmin, usav,
 
 1099     $                                  ldu, u, ldu, work, lwork, rwork,
 
 1103                     result( 27 ) = max( result( 27 ), dif )
 
 1108                     IF( m.GT.0 .AND. n.GT.0 ) 
THEN 
 1109                        IF( ijvt.EQ.1 ) 
THEN 
 1110                           CALL zunt03( 
'R', n, mnmin, n, mnmin, vtsav,
 
 1111     $                                  ldvt, vt, ldvt, work, lwork,
 
 1112     $                                  rwork, dif, iinfo )
 
 1115                     result( 28 ) = max( result( 28 ), dif )
 
 1120                     div = max( dble( mnmin )*ulp*s( 1 ),
 
 1121     $                     dlamch( 
'Safe minimum' ) )
 
 1122                     DO 150 i = 1, mnmin - 1
 
 1123                        IF( ssav( i ).LT.ssav( i+1 ) )
 
 1125                        IF( ssav( i ).LT.zero )
 
 1127                        dif = max( dif, abs( ssav( i )-s( i ) ) / div )
 
 1129                     result( 29) = max( result( 29 ), dif )
 
 1136                  iseed2( i ) = iseed( i )
 
 1138               IF( mnmin.LE.1 ) 
THEN 
 1140                  iu = max( 1, mnmin )
 
 1142                  il = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
 
 1143                  iu = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
 
 1150               CALL zlacpy( 
'F', m, n, asav, lda, a, lda )
 
 1152               CALL zgesvdx( 
'V', 
'V', 
'I', m, n, a, lda,
 
 1153     $                       vl, vu, il, iu, nsi, s, u, ldu,
 
 1154     $                       vt, ldvt, work, lwork, rwork,
 
 1156               IF( iinfo.NE.0 ) 
THEN 
 1157                  WRITE( nounit, fmt = 9995 )
'GESVDX', iinfo, m, n,
 
 1158     $               jtype, lswork, ioldsd
 
 1166               CALL zbdt05( m, n, asav, lda, s, nsi, u, ldu,
 
 1167     $                      vt, ldvt, work, result( 30 ) )
 
 1168               IF( m.NE.0 .AND. n.NE.0 ) 
THEN 
 1169                  CALL zunt01( 
'Columns', m, nsi, u, ldu, work,
 
 1170     $                         lwork, rwork, result( 31 ) )
 
 1171                  CALL zunt01( 
'Rows', nsi, n, vt, ldvt, work,
 
 1172     $                         lwork, rwork, result( 32 ) )
 
 1177               IF( mnmin.GT.0 .AND. nsi.GT.1 ) 
THEN 
 1180     $                    max( half*abs( ssav( il )-ssav( il-1 ) ),
 
 1181     $                    ulp*anorm, two*rtunfl )
 
 1184     $                    max( half*abs( ssav( ns )-ssav( 1 ) ),
 
 1185     $                    ulp*anorm, two*rtunfl )
 
 1188                     vl = ssav( iu ) - max( ulp*anorm, two*rtunfl,
 
 1189     $                    half*abs( ssav( iu+1 )-ssav( iu ) ) )
 
 1191                     vl = ssav( ns ) - max( ulp*anorm, two*rtunfl,
 
 1192     $                    half*abs( ssav( ns )-ssav( 1 ) ) )
 
 1196                  IF( vl.GE.vu ) vu = max( vu*2, vu+vl+half )
 
 1201               CALL zlacpy( 
'F', m, n, asav, lda, a, lda )
 
 1203               CALL zgesvdx( 
'V', 
'V', 
'V', m, n, a, lda,
 
 1204     $                       vl, vu, il, iu, nsv, s, u, ldu,
 
 1205     $                       vt, ldvt, work, lwork, rwork,
 
 1207               IF( iinfo.NE.0 ) 
THEN 
 1208                  WRITE( nounit, fmt = 9995 )
'GESVDX', iinfo, m, n,
 
 1209     $               jtype, lswork, ioldsd
 
 1217               CALL zbdt05( m, n, asav, lda, s, nsv, u, ldu,
 
 1218     $                      vt, ldvt, work, result( 33 ) )
 
 1219               IF( m.NE.0 .AND. n.NE.0 ) 
THEN 
 1220                  CALL zunt01( 
'Columns', m, nsv, u, ldu, work,
 
 1221     $                         lwork, rwork, result( 34 ) )
 
 1222                  CALL zunt01( 
'Rows', nsv, n, vt, ldvt, work,
 
 1223     $                         lwork, rwork, result( 35 ) )
 
 1231                  IF( result( j ).GE.zero )
 
 1233                  IF( result( j ).GE.thresh )
 
 1238     $            ntestf = ntestf + 1
 
 1239               IF( ntestf.EQ.1 ) 
THEN 
 1240                  WRITE( nounit, fmt = 9999 )
 
 1241                  WRITE( nounit, fmt = 9998 )thresh
 
 1246                  IF( result( j ).GE.thresh ) 
THEN 
 1247                     WRITE( nounit, fmt = 9997 )m, n, jtype, iwspc,
 
 1248     $                  ioldsd, j, result( j )
 
 1252               nerrs = nerrs + nfail
 
 1253               ntestt = ntestt + ntest
 
 1262      CALL alasvm( 
'ZBD', nounit, nerrs, ntestt, 0 )
 
 1264 9999 
FORMAT( 
' SVD -- Complex Singular Value Decomposition Driver ',
 
 1265     $      / 
' Matrix types (see ZDRVBD for details):',
 
 1266     $      / / 
' 1 = Zero matrix', / 
' 2 = Identity matrix',
 
 1267     $      / 
' 3 = Evenly spaced singular values near 1',
 
 1268     $      / 
' 4 = Evenly spaced singular values near underflow',
 
 1269     $      / 
' 5 = Evenly spaced singular values near overflow',
 
 1270     $      / / 
' Tests performed: ( A is dense, U and V are unitary,',
 
 1271     $      / 19x, 
' S is an array, and Upartial, VTpartial, and',
 
 1272     $      / 19x, 
' Spartial are partially computed U, VT and S),', / )
 
 1273 9998 
FORMAT( 
' Tests performed with Test Threshold = ', f8.2,
 
 1275     $      
' 1 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
 
 1276     $      / 
' 2 = | I - U**T U | / ( M ulp ) ',
 
 1277     $      / 
' 3 = | I - VT VT**T | / ( N ulp ) ',
 
 1278     $      / 
' 4 = 0 if S contains min(M,N) nonnegative values in',
 
 1279     $      
' decreasing order, else 1/ulp',
 
 1280     $      / 
' 5 = | U - Upartial | / ( M ulp )',
 
 1281     $      / 
' 6 = | VT - VTpartial | / ( N ulp )',
 
 1282     $      / 
' 7 = | S - Spartial | / ( min(M,N) ulp |S| )',
 
 1284     $      
' 8 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
 
 1285     $      / 
' 9 = | I - U**T U | / ( M ulp ) ',
 
 1286     $      / 
'10 = | I - VT VT**T | / ( N ulp ) ',
 
 1287     $      / 
'11 = 0 if S contains min(M,N) nonnegative values in',
 
 1288     $      
' decreasing order, else 1/ulp',
 
 1289     $      / 
'12 = | U - Upartial | / ( M ulp )',
 
 1290     $      / 
'13 = | VT - VTpartial | / ( N ulp )',
 
 1291     $      / 
'14 = | S - Spartial | / ( min(M,N) ulp |S| )',
 
 1293     $      / 
'15 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
 
 1294     $      / 
'16 = | I - U**T U | / ( M ulp ) ',
 
 1295     $      / 
'17 = | I - VT VT**T | / ( N ulp ) ',
 
 1296     $      / 
'18 = 0 if S contains min(M,N) nonnegative values in',
 
 1297     $      
' decreasing order, else 1/ulp',
 
 1299     $      / 
'19 = | A - U diag(S) VT | / ( |A| max(M,N) ulp )',
 
 1300     $      / 
'20 = | I - U**T U | / ( M ulp ) ',
 
 1301     $      / 
'21 = | I - VT VT**T | / ( N ulp ) ',
 
 1302     $      / 
'22 = 0 if S contains min(M,N) nonnegative values in',
 
 1303     $      
' decreasing order, else 1/ulp',
 
 1304     $      / 
' ZGESVDX(V,V,A): ', /
 
 1305     $        
'23 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
 
 1306     $      / 
'24 = | I - U**T U | / ( M ulp ) ',
 
 1307     $      / 
'25 = | I - VT VT**T | / ( N ulp ) ',
 
 1308     $      / 
'26 = 0 if S contains min(M,N) nonnegative values in',
 
 1309     $      
' decreasing order, else 1/ulp',
 
 1310     $      / 
'27 = | U - Upartial | / ( M ulp )',
 
 1311     $      / 
'28 = | VT - VTpartial | / ( N ulp )',
 
 1312     $      / 
'29 = | S - Spartial | / ( min(M,N) ulp |S| )',
 
 1313     $      / 
' ZGESVDX(V,V,I): ',
 
 1314     $      / 
'30 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp )',
 
 1315     $      / 
'31 = | I - U**T U | / ( M ulp ) ',
 
 1316     $      / 
'32 = | I - VT VT**T | / ( N ulp ) ',
 
 1317     $      / 
' ZGESVDX(V,V,V) ',
 
 1318     $      / 
'33 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp )',
 
 1319     $      / 
'34 = | I - U**T U | / ( M ulp ) ',
 
 1320     $      / 
'35 = | I - VT VT**T | / ( N ulp ) ',
 
 1321     $      
' ZGESVDQ(H,N,N,A,A',
 
 1322     $      / 
'36 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
 
 1323     $      / 
'37 = | I - U**T U | / ( M ulp ) ',
 
 1324     $      / 
'38 = | I - VT VT**T | / ( N ulp ) ',
 
 1325     $      / 
'39 = 0 if S contains min(M,N) nonnegative values in',
 
 1326     $      
' decreasing order, else 1/ulp',
 
 1328 9997 
FORMAT( 
' M=', i5, 
', N=', i5, 
', type ', i1, 
', IWS=', i1,
 
 1329     $      
', seed=', 4( i4, 
',' ), 
' test(', i2, 
')=', g11.4 )
 
 1330 9996 
FORMAT( 
' ZDRVBD: ', a, 
' returned INFO=', i6, 
'.', / 9x, 
'M=',
 
 1331     $      i6, 
', N=', i6, 
', JTYPE=', i6, 
', ISEED=(', 3( i5, 
',' ),
 
 1333 9995 
FORMAT( 
' ZDRVBD: ', a, 
' returned INFO=', i6, 
'.', / 9x, 
'M=',
 
 1334     $      i6, 
', N=', i6, 
', JTYPE=', i6, 
', LSWORK=', i6, / 9x,
 
 1335     $      
'ISEED=(', 3( i5, 
',' ), i5, 
')' )