1       SUBROUTINE ZGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT,
   2      $                   WORK, LWORK, RWORK, INFO )
   3 *
   4 *  -- LAPACK driver routine (version 3.2) --
   5 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
   6 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
   7 *     November 2006
   8 *
   9 *     .. Scalar Arguments ..
  10       CHARACTER          JOBU, JOBVT
  11       INTEGER            INFO, LDA, LDU, LDVT, LWORK, M, N
  12 *     ..
  13 *     .. Array Arguments ..
  14       DOUBLE PRECISION   RWORK( * ), S( * )
  15       COMPLEX*16         A( LDA, * ), U( LDU, * ), VT( LDVT, * ),
  16      $                   WORK( * )
  17 *     ..
  18 *
  19 *  Purpose
  20 *  =======
  21 *
  22 *  ZGESVD computes the singular value decomposition (SVD) of a complex
  23 *  M-by-N matrix A, optionally computing the left and/or right singular
  24 *  vectors. The SVD is written
  25 *
  26 *       A = U * SIGMA * conjugate-transpose(V)
  27 *
  28 *  where SIGMA is an M-by-N matrix which is zero except for its
  29 *  min(m,n) diagonal elements, U is an M-by-M unitary matrix, and
  30 *  V is an N-by-N unitary matrix.  The diagonal elements of SIGMA
  31 *  are the singular values of A; they are real and non-negative, and
  32 *  are returned in descending order.  The first min(m,n) columns of
  33 *  U and V are the left and right singular vectors of A.
  34 *
  35 *  Note that the routine returns V**H, not V.
  36 *
  37 *  Arguments
  38 *  =========
  39 *
  40 *  JOBU    (input) CHARACTER*1
  41 *          Specifies options for computing all or part of the matrix U:
  42 *          = 'A':  all M columns of U are returned in array U:
  43 *          = 'S':  the first min(m,n) columns of U (the left singular
  44 *                  vectors) are returned in the array U;
  45 *          = 'O':  the first min(m,n) columns of U (the left singular
  46 *                  vectors) are overwritten on the array A;
  47 *          = 'N':  no columns of U (no left singular vectors) are
  48 *                  computed.
  49 *
  50 *  JOBVT   (input) CHARACTER*1
  51 *          Specifies options for computing all or part of the matrix
  52 *          V**H:
  53 *          = 'A':  all N rows of V**H are returned in the array VT;
  54 *          = 'S':  the first min(m,n) rows of V**H (the right singular
  55 *                  vectors) are returned in the array VT;
  56 *          = 'O':  the first min(m,n) rows of V**H (the right singular
  57 *                  vectors) are overwritten on the array A;
  58 *          = 'N':  no rows of V**H (no right singular vectors) are
  59 *                  computed.
  60 *
  61 *          JOBVT and JOBU cannot both be 'O'.
  62 *
  63 *  M       (input) INTEGER
  64 *          The number of rows of the input matrix A.  M >= 0.
  65 *
  66 *  N       (input) INTEGER
  67 *          The number of columns of the input matrix A.  N >= 0.
  68 *
  69 *  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
  70 *          On entry, the M-by-N matrix A.
  71 *          On exit,
  72 *          if JOBU = 'O',  A is overwritten with the first min(m,n)
  73 *                          columns of U (the left singular vectors,
  74 *                          stored columnwise);
  75 *          if JOBVT = 'O', A is overwritten with the first min(m,n)
  76 *                          rows of V**H (the right singular vectors,
  77 *                          stored rowwise);
  78 *          if JOBU .ne. 'O' and JOBVT .ne. 'O', the contents of A
  79 *                          are destroyed.
  80 *
  81 *  LDA     (input) INTEGER
  82 *          The leading dimension of the array A.  LDA >= max(1,M).
  83 *
  84 *  S       (output) DOUBLE PRECISION array, dimension (min(M,N))
  85 *          The singular values of A, sorted so that S(i) >= S(i+1).
  86 *
  87 *  U       (output) COMPLEX*16 array, dimension (LDU,UCOL)
  88 *          (LDU,M) if JOBU = 'A' or (LDU,min(M,N)) if JOBU = 'S'.
  89 *          If JOBU = 'A', U contains the M-by-M unitary matrix U;
  90 *          if JOBU = 'S', U contains the first min(m,n) columns of U
  91 *          (the left singular vectors, stored columnwise);
  92 *          if JOBU = 'N' or 'O', U is not referenced.
  93 *
  94 *  LDU     (input) INTEGER
  95 *          The leading dimension of the array U.  LDU >= 1; if
  96 *          JOBU = 'S' or 'A', LDU >= M.
  97 *
  98 *  VT      (output) COMPLEX*16 array, dimension (LDVT,N)
  99 *          If JOBVT = 'A', VT contains the N-by-N unitary matrix
 100 *          V**H;
 101 *          if JOBVT = 'S', VT contains the first min(m,n) rows of
 102 *          V**H (the right singular vectors, stored rowwise);
 103 *          if JOBVT = 'N' or 'O', VT is not referenced.
 104 *
 105 *  LDVT    (input) INTEGER
 106 *          The leading dimension of the array VT.  LDVT >= 1; if
 107 *          JOBVT = 'A', LDVT >= N; if JOBVT = 'S', LDVT >= min(M,N).
 108 *
 109 *  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
 110 *          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
 111 *
 112 *  LWORK   (input) INTEGER
 113 *          The dimension of the array WORK.
 114 *          LWORK >=  MAX(1,2*MIN(M,N)+MAX(M,N)).
 115 *          For good performance, LWORK should generally be larger.
 116 *
 117 *          If LWORK = -1, then a workspace query is assumed; the routine
 118 *          only calculates the optimal size of the WORK array, returns
 119 *          this value as the first entry of the WORK array, and no error
 120 *          message related to LWORK is issued by XERBLA.
 121 *
 122 *  RWORK   (workspace) DOUBLE PRECISION array, dimension (5*min(M,N))
 123 *          On exit, if INFO > 0, RWORK(1:MIN(M,N)-1) contains the
 124 *          unconverged superdiagonal elements of an upper bidiagonal
 125 *          matrix B whose diagonal is in S (not necessarily sorted).
 126 *          B satisfies A = U * B * VT, so it has the same singular
 127 *          values as A, and singular vectors related by U and VT.
 128 *
 129 *  INFO    (output) INTEGER
 130 *          = 0:  successful exit.
 131 *          < 0:  if INFO = -i, the i-th argument had an illegal value.
 132 *          > 0:  if ZBDSQR did not converge, INFO specifies how many
 133 *                superdiagonals of an intermediate bidiagonal form B
 134 *                did not converge to zero. See the description of RWORK
 135 *                above for details.
 136 *
 137 *  =====================================================================
 138 *
 139 *     .. Parameters ..
 140       COMPLEX*16         CZERO, CONE
 141       PARAMETER          ( CZERO = ( 0.0D00.0D0 ),
 142      $                   CONE = ( 1.0D00.0D0 ) )
 143       DOUBLE PRECISION   ZERO, ONE
 144       PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
 145 *     ..
 146 *     .. Local Scalars ..
 147       LOGICAL            LQUERY, WNTUA, WNTUAS, WNTUN, WNTUO, WNTUS,
 148      $                   WNTVA, WNTVAS, WNTVN, WNTVO, WNTVS
 149       INTEGER            BLK, CHUNK, I, IE, IERR, IR, IRWORK, ISCL,
 150      $                   ITAU, ITAUP, ITAUQ, IU, IWORK, LDWRKR, LDWRKU,
 151      $                   MAXWRK, MINMN, MINWRK, MNTHR, NCU, NCVT, NRU,
 152      $                   NRVT, WRKBL
 153       DOUBLE PRECISION   ANRM, BIGNUM, EPS, SMLNUM
 154 *     ..
 155 *     .. Local Arrays ..
 156       DOUBLE PRECISION   DUM( 1 )
 157       COMPLEX*16         CDUM( 1 )
 158 *     ..
 159 *     .. External Subroutines ..
 160       EXTERNAL           DLASCL, XERBLA, ZBDSQR, ZGEBRD, ZGELQF, ZGEMM,
 161      $                   ZGEQRF, ZLACPY, ZLASCL, ZLASET, ZUNGBR, ZUNGLQ,
 162      $                   ZUNGQR, ZUNMBR
 163 *     ..
 164 *     .. External Functions ..
 165       LOGICAL            LSAME
 166       INTEGER            ILAENV
 167       DOUBLE PRECISION   DLAMCH, ZLANGE
 168       EXTERNAL           LSAME, ILAENV, DLAMCH, ZLANGE
 169 *     ..
 170 *     .. Intrinsic Functions ..
 171       INTRINSIC          MAXMINSQRT
 172 *     ..
 173 *     .. Executable Statements ..
 174 *
 175 *     Test the input arguments
 176 *
 177       INFO = 0
 178       MINMN = MIN( M, N )
 179       WNTUA = LSAME( JOBU, 'A' )
 180       WNTUS = LSAME( JOBU, 'S' )
 181       WNTUAS = WNTUA .OR. WNTUS
 182       WNTUO = LSAME( JOBU, 'O' )
 183       WNTUN = LSAME( JOBU, 'N' )
 184       WNTVA = LSAME( JOBVT, 'A' )
 185       WNTVS = LSAME( JOBVT, 'S' )
 186       WNTVAS = WNTVA .OR. WNTVS
 187       WNTVO = LSAME( JOBVT, 'O' )
 188       WNTVN = LSAME( JOBVT, 'N' )
 189       LQUERY = ( LWORK.EQ.-1 )
 190 *
 191       IF.NOT.( WNTUA .OR. WNTUS .OR. WNTUO .OR. WNTUN ) ) THEN
 192          INFO = -1
 193       ELSE IF.NOT.( WNTVA .OR. WNTVS .OR. WNTVO .OR. WNTVN ) .OR.
 194      $         ( WNTVO .AND. WNTUO ) ) THEN
 195          INFO = -2
 196       ELSE IF( M.LT.0 ) THEN
 197          INFO = -3
 198       ELSE IF( N.LT.0 ) THEN
 199          INFO = -4
 200       ELSE IF( LDA.LT.MAX1, M ) ) THEN
 201          INFO = -6
 202       ELSE IF( LDU.LT.1 .OR. ( WNTUAS .AND. LDU.LT.M ) ) THEN
 203          INFO = -9
 204       ELSE IF( LDVT.LT.1 .OR. ( WNTVA .AND. LDVT.LT.N ) .OR.
 205      $         ( WNTVS .AND. LDVT.LT.MINMN ) ) THEN
 206          INFO = -11
 207       END IF
 208 *
 209 *     Compute workspace
 210 *      (Note: Comments in the code beginning "Workspace:" describe the
 211 *       minimal amount of workspace needed at that point in the code,
 212 *       as well as the preferred amount for good performance.
 213 *       CWorkspace refers to complex workspace, and RWorkspace to
 214 *       real workspace. NB refers to the optimal block size for the
 215 *       immediately following subroutine, as returned by ILAENV.)
 216 *
 217       IF( INFO.EQ.0 ) THEN
 218          MINWRK = 1
 219          MAXWRK = 1
 220          IF( M.GE..AND. MINMN.GT.0 ) THEN
 221 *
 222 *           Space needed for ZBDSQR is BDSPAC = 5*N
 223 *
 224             MNTHR = ILAENV( 6'ZGESVD', JOBU // JOBVT, M, N, 00 )
 225             IF( M.GE.MNTHR ) THEN
 226                IF( WNTUN ) THEN
 227 *
 228 *                 Path 1 (M much larger than N, JOBU='N')
 229 *
 230                   MAXWRK = N + N*ILAENV( 1'ZGEQRF'' ', M, N, -1,
 231      $                     -1 )
 232                   MAXWRK = MAX( MAXWRK, 2*N+2*N*
 233      $                     ILAENV( 1'ZGEBRD'' ', N, N, -1-1 ) )
 234                   IF( WNTVO .OR. WNTVAS )
 235      $               MAXWRK = MAX( MAXWRK, 2*N+( N-1 )*
 236      $                        ILAENV( 1'ZUNGBR''P', N, N, N, -1 ) )
 237                   MINWRK = 3*N
 238                ELSE IF( WNTUO .AND. WNTVN ) THEN
 239 *
 240 *                 Path 2 (M much larger than N, JOBU='O', JOBVT='N')
 241 *
 242                   WRKBL = N + N*ILAENV( 1'ZGEQRF'' ', M, N, -1-1 )
 243                   WRKBL = MAX( WRKBL, N+N*ILAENV( 1'ZUNGQR'' ', M,
 244      $                    N, N, -1 ) )
 245                   WRKBL = MAX( WRKBL, 2*N+2*N*
 246      $                    ILAENV( 1'ZGEBRD'' ', N, N, -1-1 ) )
 247                   WRKBL = MAX( WRKBL, 2*N+N*
 248      $                    ILAENV( 1'ZUNGBR''Q', N, N, N, -1 ) )
 249                   MAXWRK = MAX( N*N+WRKBL, N*N+M*N )
 250                   MINWRK = 2*+ M
 251                ELSE IF( WNTUO .AND. WNTVAS ) THEN
 252 *
 253 *                 Path 3 (M much larger than N, JOBU='O', JOBVT='S' or
 254 *                 'A')
 255 *
 256                   WRKBL = N + N*ILAENV( 1'ZGEQRF'' ', M, N, -1-1 )
 257                   WRKBL = MAX( WRKBL, N+N*ILAENV( 1'ZUNGQR'' ', M,
 258      $                    N, N, -1 ) )
 259                   WRKBL = MAX( WRKBL, 2*N+2*N*
 260      $                    ILAENV( 1'ZGEBRD'' ', N, N, -1-1 ) )
 261                   WRKBL = MAX( WRKBL, 2*N+N*
 262      $                    ILAENV( 1'ZUNGBR''Q', N, N, N, -1 ) )
 263                   WRKBL = MAX( WRKBL, 2*N+( N-1 )*
 264      $                    ILAENV( 1'ZUNGBR''P', N, N, N, -1 ) )
 265                   MAXWRK = MAX( N*N+WRKBL, N*N+M*N )
 266                   MINWRK = 2*+ M
 267                ELSE IF( WNTUS .AND. WNTVN ) THEN
 268 *
 269 *                 Path 4 (M much larger than N, JOBU='S', JOBVT='N')
 270 *
 271                   WRKBL = N + N*ILAENV( 1'ZGEQRF'' ', M, N, -1-1 )
 272                   WRKBL = MAX( WRKBL, N+N*ILAENV( 1'ZUNGQR'' ', M,
 273      $                    N, N, -1 ) )
 274                   WRKBL = MAX( WRKBL, 2*N+2*N*
 275      $                    ILAENV( 1'ZGEBRD'' ', N, N, -1-1 ) )
 276                   WRKBL = MAX( WRKBL, 2*N+N*
 277      $                    ILAENV( 1'ZUNGBR''Q', N, N, N, -1 ) )
 278                   MAXWRK = N*+ WRKBL
 279                   MINWRK = 2*+ M
 280                ELSE IF( WNTUS .AND. WNTVO ) THEN
 281 *
 282 *                 Path 5 (M much larger than N, JOBU='S', JOBVT='O')
 283 *
 284                   WRKBL = N + N*ILAENV( 1'ZGEQRF'' ', M, N, -1-1 )
 285                   WRKBL = MAX( WRKBL, N+N*ILAENV( 1'ZUNGQR'' ', M,
 286      $                    N, N, -1 ) )
 287                   WRKBL = MAX( WRKBL, 2*N+2*N*
 288      $                    ILAENV( 1'ZGEBRD'' ', N, N, -1-1 ) )
 289                   WRKBL = MAX( WRKBL, 2*N+N*
 290      $                    ILAENV( 1'ZUNGBR''Q', N, N, N, -1 ) )
 291                   WRKBL = MAX( WRKBL, 2*N+( N-1 )*
 292      $                    ILAENV( 1'ZUNGBR''P', N, N, N, -1 ) )
 293                   MAXWRK = 2*N*+ WRKBL
 294                   MINWRK = 2*+ M
 295                ELSE IF( WNTUS .AND. WNTVAS ) THEN
 296 *
 297 *                 Path 6 (M much larger than N, JOBU='S', JOBVT='S' or
 298 *                 'A')
 299 *
 300                   WRKBL = N + N*ILAENV( 1'ZGEQRF'' ', M, N, -1-1 )
 301                   WRKBL = MAX( WRKBL, N+N*ILAENV( 1'ZUNGQR'' ', M,
 302      $                    N, N, -1 ) )
 303                   WRKBL = MAX( WRKBL, 2*N+2*N*
 304      $                    ILAENV( 1'ZGEBRD'' ', N, N, -1-1 ) )
 305                   WRKBL = MAX( WRKBL, 2*N+N*
 306      $                    ILAENV( 1'ZUNGBR''Q', N, N, N, -1 ) )
 307                   WRKBL = MAX( WRKBL, 2*N+( N-1 )*
 308      $                    ILAENV( 1'ZUNGBR''P', N, N, N, -1 ) )
 309                   MAXWRK = N*+ WRKBL
 310                   MINWRK = 2*+ M
 311                ELSE IF( WNTUA .AND. WNTVN ) THEN
 312 *
 313 *                 Path 7 (M much larger than N, JOBU='A', JOBVT='N')
 314 *
 315                   WRKBL = N + N*ILAENV( 1'ZGEQRF'' ', M, N, -1-1 )
 316                   WRKBL = MAX( WRKBL, N+M*ILAENV( 1'ZUNGQR'' ', M,
 317      $                    M, N, -1 ) )
 318                   WRKBL = MAX( WRKBL, 2*N+2*N*
 319      $                    ILAENV( 1'ZGEBRD'' ', N, N, -1-1 ) )
 320                   WRKBL = MAX( WRKBL, 2*N+N*
 321      $                    ILAENV( 1'ZUNGBR''Q', N, N, N, -1 ) )
 322                   MAXWRK = N*+ WRKBL
 323                   MINWRK = 2*+ M
 324                ELSE IF( WNTUA .AND. WNTVO ) THEN
 325 *
 326 *                 Path 8 (M much larger than N, JOBU='A', JOBVT='O')
 327 *
 328                   WRKBL = N + N*ILAENV( 1'ZGEQRF'' ', M, N, -1-1 )
 329                   WRKBL = MAX( WRKBL, N+M*ILAENV( 1'ZUNGQR'' ', M,
 330      $                    M, N, -1 ) )
 331                   WRKBL = MAX( WRKBL, 2*N+2*N*
 332      $                    ILAENV( 1'ZGEBRD'' ', N, N, -1-1 ) )
 333                   WRKBL = MAX( WRKBL, 2*N+N*
 334      $                    ILAENV( 1'ZUNGBR''Q', N, N, N, -1 ) )
 335                   WRKBL = MAX( WRKBL, 2*N+( N-1 )*
 336      $                    ILAENV( 1'ZUNGBR''P', N, N, N, -1 ) )
 337                   MAXWRK = 2*N*+ WRKBL
 338                   MINWRK = 2*+ M
 339                ELSE IF( WNTUA .AND. WNTVAS ) THEN
 340 *
 341 *                 Path 9 (M much larger than N, JOBU='A', JOBVT='S' or
 342 *                 'A')
 343 *
 344                   WRKBL = N + N*ILAENV( 1'ZGEQRF'' ', M, N, -1-1 )
 345                   WRKBL = MAX( WRKBL, N+M*ILAENV( 1'ZUNGQR'' ', M,
 346      $                    M, N, -1 ) )
 347                   WRKBL = MAX( WRKBL, 2*N+2*N*
 348      $                    ILAENV( 1'ZGEBRD'' ', N, N, -1-1 ) )
 349                   WRKBL = MAX( WRKBL, 2*N+N*
 350      $                    ILAENV( 1'ZUNGBR''Q', N, N, N, -1 ) )
 351                   WRKBL = MAX( WRKBL, 2*N+( N-1 )*
 352      $                    ILAENV( 1'ZUNGBR''P', N, N, N, -1 ) )
 353                   MAXWRK = N*+ WRKBL
 354                   MINWRK = 2*+ M
 355                END IF
 356             ELSE
 357 *
 358 *              Path 10 (M at least N, but not much larger)
 359 *
 360                MAXWRK = 2*+ ( M+N )*ILAENV( 1'ZGEBRD'' ', M, N,
 361      $                  -1-1 )
 362                IF( WNTUS .OR. WNTUO )
 363      $            MAXWRK = MAX( MAXWRK, 2*N+N*
 364      $                     ILAENV( 1'ZUNGBR''Q', M, N, N, -1 ) )
 365                IF( WNTUA )
 366      $            MAXWRK = MAX( MAXWRK, 2*N+M*
 367      $                     ILAENV( 1'ZUNGBR''Q', M, M, N, -1 ) )
 368                IF.NOT.WNTVN )
 369      $            MAXWRK = MAX( MAXWRK, 2*N+( N-1 )*
 370      $                     ILAENV( 1'ZUNGBR''P', N, N, N, -1 ) )
 371                MINWRK = 2*+ M
 372             END IF
 373          ELSE IF( MINMN.GT.0 ) THEN
 374 *
 375 *           Space needed for ZBDSQR is BDSPAC = 5*M
 376 *
 377             MNTHR = ILAENV( 6'ZGESVD', JOBU // JOBVT, M, N, 00 )
 378             IF( N.GE.MNTHR ) THEN
 379                IF( WNTVN ) THEN
 380 *
 381 *                 Path 1t(N much larger than M, JOBVT='N')
 382 *
 383                   MAXWRK = M + M*ILAENV( 1'ZGELQF'' ', M, N, -1,
 384      $                     -1 )
 385                   MAXWRK = MAX( MAXWRK, 2*M+2*M*
 386      $                     ILAENV( 1'ZGEBRD'' ', M, M, -1-1 ) )
 387                   IF( WNTUO .OR. WNTUAS )
 388      $               MAXWRK = MAX( MAXWRK, 2*M+M*
 389      $                        ILAENV( 1'ZUNGBR''Q', M, M, M, -1 ) )
 390                   MINWRK = 3*M
 391                ELSE IF( WNTVO .AND. WNTUN ) THEN
 392 *
 393 *                 Path 2t(N much larger than M, JOBU='N', JOBVT='O')
 394 *
 395                   WRKBL = M + M*ILAENV( 1'ZGELQF'' ', M, N, -1-1 )
 396                   WRKBL = MAX( WRKBL, M+M*ILAENV( 1'ZUNGLQ'' ', M,
 397      $                    N, M, -1 ) )
 398                   WRKBL = MAX( WRKBL, 2*M+2*M*
 399      $                    ILAENV( 1'ZGEBRD'' ', M, M, -1-1 ) )
 400                   WRKBL = MAX( WRKBL, 2*M+( M-1 )*
 401      $                    ILAENV( 1'ZUNGBR''P', M, M, M, -1 ) )
 402                   MAXWRK = MAX( M*M+WRKBL, M*M+M*N )
 403                   MINWRK = 2*+ N
 404                ELSE IF( WNTVO .AND. WNTUAS ) THEN
 405 *
 406 *                 Path 3t(N much larger than M, JOBU='S' or 'A',
 407 *                 JOBVT='O')
 408 *
 409                   WRKBL = M + M*ILAENV( 1'ZGELQF'' ', M, N, -1-1 )
 410                   WRKBL = MAX( WRKBL, M+M*ILAENV( 1'ZUNGLQ'' ', M,
 411      $                    N, M, -1 ) )
 412                   WRKBL = MAX( WRKBL, 2*M+2*M*
 413      $                    ILAENV( 1'ZGEBRD'' ', M, M, -1-1 ) )
 414                   WRKBL = MAX( WRKBL, 2*M+( M-1 )*
 415      $                    ILAENV( 1'ZUNGBR''P', M, M, M, -1 ) )
 416                   WRKBL = MAX( WRKBL, 2*M+M*
 417      $                    ILAENV( 1'ZUNGBR''Q', M, M, M, -1 ) )
 418                   MAXWRK = MAX( M*M+WRKBL, M*M+M*N )
 419                   MINWRK = 2*+ N
 420                ELSE IF( WNTVS .AND. WNTUN ) THEN
 421 *
 422 *                 Path 4t(N much larger than M, JOBU='N', JOBVT='S')
 423 *
 424                   WRKBL = M + M*ILAENV( 1'ZGELQF'' ', M, N, -1-1 )
 425                   WRKBL = MAX( WRKBL, M+M*ILAENV( 1'ZUNGLQ'' ', M,
 426      $                    N, M, -1 ) )
 427                   WRKBL = MAX( WRKBL, 2*M+2*M*
 428      $                    ILAENV( 1'ZGEBRD'' ', M, M, -1-1 ) )
 429                   WRKBL = MAX( WRKBL, 2*M+( M-1 )*
 430      $                    ILAENV( 1'ZUNGBR''P', M, M, M, -1 ) )
 431                   MAXWRK = M*+ WRKBL
 432                   MINWRK = 2*+ N
 433                ELSE IF( WNTVS .AND. WNTUO ) THEN
 434 *
 435 *                 Path 5t(N much larger than M, JOBU='O', JOBVT='S')
 436 *
 437                   WRKBL = M + M*ILAENV( 1'ZGELQF'' ', M, N, -1-1 )
 438                   WRKBL = MAX( WRKBL, M+M*ILAENV( 1'ZUNGLQ'' ', M,
 439      $                    N, M, -1 ) )
 440                   WRKBL = MAX( WRKBL, 2*M+2*M*
 441      $                    ILAENV( 1'ZGEBRD'' ', M, M, -1-1 ) )
 442                   WRKBL = MAX( WRKBL, 2*M+( M-1 )*
 443      $                    ILAENV( 1'ZUNGBR''P', M, M, M, -1 ) )
 444                   WRKBL = MAX( WRKBL, 2*M+M*
 445      $                    ILAENV( 1'ZUNGBR''Q', M, M, M, -1 ) )
 446                   MAXWRK = 2*M*+ WRKBL
 447                   MINWRK = 2*+ N
 448                ELSE IF( WNTVS .AND. WNTUAS ) THEN
 449 *
 450 *                 Path 6t(N much larger than M, JOBU='S' or 'A',
 451 *                 JOBVT='S')
 452 *
 453                   WRKBL = M + M*ILAENV( 1'ZGELQF'' ', M, N, -1-1 )
 454                   WRKBL = MAX( WRKBL, M+M*ILAENV( 1'ZUNGLQ'' ', M,
 455      $                    N, M, -1 ) )
 456                   WRKBL = MAX( WRKBL, 2*M+2*M*
 457      $                    ILAENV( 1'ZGEBRD'' ', M, M, -1-1 ) )
 458                   WRKBL = MAX( WRKBL, 2*M+( M-1 )*
 459      $                    ILAENV( 1'ZUNGBR''P', M, M, M, -1 ) )
 460                   WRKBL = MAX( WRKBL, 2*M+M*
 461      $                    ILAENV( 1'ZUNGBR''Q', M, M, M, -1 ) )
 462                   MAXWRK = M*+ WRKBL
 463                   MINWRK = 2*+ N
 464                ELSE IF( WNTVA .AND. WNTUN ) THEN
 465 *
 466 *                 Path 7t(N much larger than M, JOBU='N', JOBVT='A')
 467 *
 468                   WRKBL = M + M*ILAENV( 1'ZGELQF'' ', M, N, -1-1 )
 469                   WRKBL = MAX( WRKBL, M+N*ILAENV( 1'ZUNGLQ'' ', N,
 470      $                    N, M, -1 ) )
 471                   WRKBL = MAX( WRKBL, 2*M+2*M*
 472      $                    ILAENV( 1'ZGEBRD'' ', M, M, -1-1 ) )
 473                   WRKBL = MAX( WRKBL, 2*M+( M-1 )*
 474      $                    ILAENV( 1'ZUNGBR''P', M, M, M, -1 ) )
 475                   MAXWRK = M*+ WRKBL
 476                   MINWRK = 2*+ N
 477                ELSE IF( WNTVA .AND. WNTUO ) THEN
 478 *
 479 *                 Path 8t(N much larger than M, JOBU='O', JOBVT='A')
 480 *
 481                   WRKBL = M + M*ILAENV( 1'ZGELQF'' ', M, N, -1-1 )
 482                   WRKBL = MAX( WRKBL, M+N*ILAENV( 1'ZUNGLQ'' ', N,
 483      $                    N, M, -1 ) )
 484                   WRKBL = MAX( WRKBL, 2*M+2*M*
 485      $                    ILAENV( 1'ZGEBRD'' ', M, M, -1-1 ) )
 486                   WRKBL = MAX( WRKBL, 2*M+( M-1 )*
 487      $                    ILAENV( 1'ZUNGBR''P', M, M, M, -1 ) )
 488                   WRKBL = MAX( WRKBL, 2*M+M*
 489      $                    ILAENV( 1'ZUNGBR''Q', M, M, M, -1 ) )
 490                   MAXWRK = 2*M*+ WRKBL
 491                   MINWRK = 2*+ N
 492                ELSE IF( WNTVA .AND. WNTUAS ) THEN
 493 *
 494 *                 Path 9t(N much larger than M, JOBU='S' or 'A',
 495 *                 JOBVT='A')
 496 *
 497                   WRKBL = M + M*ILAENV( 1'ZGELQF'' ', M, N, -1-1 )
 498                   WRKBL = MAX( WRKBL, M+N*ILAENV( 1'ZUNGLQ'' ', N,
 499      $                    N, M, -1 ) )
 500                   WRKBL = MAX( WRKBL, 2*M+2*M*
 501      $                    ILAENV( 1'ZGEBRD'' ', M, M, -1-1 ) )
 502                   WRKBL = MAX( WRKBL, 2*M+( M-1 )*
 503      $                    ILAENV( 1'ZUNGBR''P', M, M, M, -1 ) )
 504                   WRKBL = MAX( WRKBL, 2*M+M*
 505      $                    ILAENV( 1'ZUNGBR''Q', M, M, M, -1 ) )
 506                   MAXWRK = M*+ WRKBL
 507                   MINWRK = 2*+ N
 508                END IF
 509             ELSE
 510 *
 511 *              Path 10t(N greater than M, but not much larger)
 512 *
 513                MAXWRK = 2*+ ( M+N )*ILAENV( 1'ZGEBRD'' ', M, N,
 514      $                  -1-1 )
 515                IF( WNTVS .OR. WNTVO )
 516      $            MAXWRK = MAX( MAXWRK, 2*M+M*
 517      $                     ILAENV( 1'ZUNGBR''P', M, N, M, -1 ) )
 518                IF( WNTVA )
 519      $            MAXWRK = MAX( MAXWRK, 2*M+N*
 520      $                     ILAENV( 1'ZUNGBR''P', N, N, M, -1 ) )
 521                IF.NOT.WNTUN )
 522      $            MAXWRK = MAX( MAXWRK, 2*M+( M-1 )*
 523      $                     ILAENV( 1'ZUNGBR''Q', M, M, M, -1 ) )
 524                MINWRK = 2*+ N
 525             END IF
 526          END IF
 527          MAXWRK = MAX( MAXWRK, MINWRK )
 528          WORK( 1 ) = MAXWRK
 529 *
 530          IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
 531             INFO = -13
 532          END IF
 533       END IF
 534 *
 535       IF( INFO.NE.0 ) THEN
 536          CALL XERBLA( 'ZGESVD'-INFO )
 537          RETURN
 538       ELSE IF( LQUERY ) THEN
 539          RETURN
 540       END IF
 541 *
 542 *     Quick return if possible
 543 *
 544       IF( M.EQ.0 .OR. N.EQ.0 ) THEN
 545          RETURN
 546       END IF
 547 *
 548 *     Get machine constants
 549 *
 550       EPS = DLAMCH( 'P' )
 551       SMLNUM = SQRT( DLAMCH( 'S' ) ) / EPS
 552       BIGNUM = ONE / SMLNUM
 553 *
 554 *     Scale A if max element outside range [SMLNUM,BIGNUM]
 555 *
 556       ANRM = ZLANGE( 'M', M, N, A, LDA, DUM )
 557       ISCL = 0
 558       IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
 559          ISCL = 1
 560          CALL ZLASCL( 'G'00, ANRM, SMLNUM, M, N, A, LDA, IERR )
 561       ELSE IF( ANRM.GT.BIGNUM ) THEN
 562          ISCL = 1
 563          CALL ZLASCL( 'G'00, ANRM, BIGNUM, M, N, A, LDA, IERR )
 564       END IF
 565 *
 566       IF( M.GE.N ) THEN
 567 *
 568 *        A has at least as many rows as columns. If A has sufficiently
 569 *        more rows than columns, first reduce using the QR
 570 *        decomposition (if sufficient workspace available)
 571 *
 572          IF( M.GE.MNTHR ) THEN
 573 *
 574             IF( WNTUN ) THEN
 575 *
 576 *              Path 1 (M much larger than N, JOBU='N')
 577 *              No left singular vectors to be computed
 578 *
 579                ITAU = 1
 580                IWORK = ITAU + N
 581 *
 582 *              Compute A=Q*R
 583 *              (CWorkspace: need 2*N, prefer N+N*NB)
 584 *              (RWorkspace: need 0)
 585 *
 586                CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
 587      $                      LWORK-IWORK+1, IERR )
 588 *
 589 *              Zero out below R
 590 *
 591                CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO, A( 21 ),
 592      $                      LDA )
 593                IE = 1
 594                ITAUQ = 1
 595                ITAUP = ITAUQ + N
 596                IWORK = ITAUP + N
 597 *
 598 *              Bidiagonalize R in A
 599 *              (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
 600 *              (RWorkspace: need N)
 601 *
 602                CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
 603      $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
 604      $                      IERR )
 605                NCVT = 0
 606                IF( WNTVO .OR. WNTVAS ) THEN
 607 *
 608 *                 If right singular vectors desired, generate P'.
 609 *                 (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
 610 *                 (RWorkspace: 0)
 611 *
 612                   CALL ZUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
 613      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 614                   NCVT = N
 615                END IF
 616                IRWORK = IE + N
 617 *
 618 *              Perform bidiagonal QR iteration, computing right
 619 *              singular vectors of A in A if desired
 620 *              (CWorkspace: 0)
 621 *              (RWorkspace: need BDSPAC)
 622 *
 623                CALL ZBDSQR( 'U', N, NCVT, 00, S, RWORK( IE ), A, LDA,
 624      $                      CDUM, 1, CDUM, 1, RWORK( IRWORK ), INFO )
 625 *
 626 *              If right singular vectors desired in VT, copy them there
 627 *
 628                IF( WNTVAS )
 629      $            CALL ZLACPY( 'F', N, N, A, LDA, VT, LDVT )
 630 *
 631             ELSE IF( WNTUO .AND. WNTVN ) THEN
 632 *
 633 *              Path 2 (M much larger than N, JOBU='O', JOBVT='N')
 634 *              N left singular vectors to be overwritten on A and
 635 *              no right singular vectors to be computed
 636 *
 637                IF( LWORK.GE.N*N+3*N ) THEN
 638 *
 639 *                 Sufficient workspace for a fast algorithm
 640 *
 641                   IR = 1
 642                   IF( LWORK.GE.MAX( WRKBL, LDA*N )+LDA*N ) THEN
 643 *
 644 *                    WORK(IU) is LDA by N, WORK(IR) is LDA by N
 645 *
 646                      LDWRKU = LDA
 647                      LDWRKR = LDA
 648                   ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N )+N*N ) THEN
 649 *
 650 *                    WORK(IU) is LDA by N, WORK(IR) is N by N
 651 *
 652                      LDWRKU = LDA
 653                      LDWRKR = N
 654                   ELSE
 655 *
 656 *                    WORK(IU) is LDWRKU by N, WORK(IR) is N by N
 657 *
 658                      LDWRKU = ( LWORK-N*N ) / N
 659                      LDWRKR = N
 660                   END IF
 661                   ITAU = IR + LDWRKR*N
 662                   IWORK = ITAU + N
 663 *
 664 *                 Compute A=Q*R
 665 *                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
 666 *                 (RWorkspace: 0)
 667 *
 668                   CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
 669      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 670 *
 671 *                 Copy R to WORK(IR) and zero out below it
 672 *
 673                   CALL ZLACPY( 'U', N, N, A, LDA, WORK( IR ), LDWRKR )
 674                   CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
 675      $                         WORK( IR+1 ), LDWRKR )
 676 *
 677 *                 Generate Q in A
 678 *                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
 679 *                 (RWorkspace: 0)
 680 *
 681                   CALL ZUNGQR( M, N, N, A, LDA, WORK( ITAU ),
 682      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 683                   IE = 1
 684                   ITAUQ = ITAU
 685                   ITAUP = ITAUQ + N
 686                   IWORK = ITAUP + N
 687 *
 688 *                 Bidiagonalize R in WORK(IR)
 689 *                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
 690 *                 (RWorkspace: need N)
 691 *
 692                   CALL ZGEBRD( N, N, WORK( IR ), LDWRKR, S, RWORK( IE ),
 693      $                         WORK( ITAUQ ), WORK( ITAUP ),
 694      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 695 *
 696 *                 Generate left vectors bidiagonalizing R
 697 *                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
 698 *                 (RWorkspace: need 0)
 699 *
 700                   CALL ZUNGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
 701      $                         WORK( ITAUQ ), WORK( IWORK ),
 702      $                         LWORK-IWORK+1, IERR )
 703                   IRWORK = IE + N
 704 *
 705 *                 Perform bidiagonal QR iteration, computing left
 706 *                 singular vectors of R in WORK(IR)
 707 *                 (CWorkspace: need N*N)
 708 *                 (RWorkspace: need BDSPAC)
 709 *
 710                   CALL ZBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM, 1,
 711      $                         WORK( IR ), LDWRKR, CDUM, 1,
 712      $                         RWORK( IRWORK ), INFO )
 713                   IU = ITAUQ
 714 *
 715 *                 Multiply Q in A by left singular vectors of R in
 716 *                 WORK(IR), storing result in WORK(IU) and copying to A
 717 *                 (CWorkspace: need N*N+N, prefer N*N+M*N)
 718 *                 (RWorkspace: 0)
 719 *
 720                   DO 10 I = 1, M, LDWRKU
 721                      CHUNK = MIN( M-I+1, LDWRKU )
 722                      CALL ZGEMM( 'N''N', CHUNK, N, N, CONE, A( I, 1 ),
 723      $                           LDA, WORK( IR ), LDWRKR, CZERO,
 724      $                           WORK( IU ), LDWRKU )
 725                      CALL ZLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
 726      $                            A( I, 1 ), LDA )
 727    10             CONTINUE
 728 *
 729                ELSE
 730 *
 731 *                 Insufficient workspace for a fast algorithm
 732 *
 733                   IE = 1
 734                   ITAUQ = 1
 735                   ITAUP = ITAUQ + N
 736                   IWORK = ITAUP + N
 737 *
 738 *                 Bidiagonalize A
 739 *                 (CWorkspace: need 2*N+M, prefer 2*N+(M+N)*NB)
 740 *                 (RWorkspace: N)
 741 *
 742                   CALL ZGEBRD( M, N, A, LDA, S, RWORK( IE ),
 743      $                         WORK( ITAUQ ), WORK( ITAUP ),
 744      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 745 *
 746 *                 Generate left vectors bidiagonalizing A
 747 *                 (CWorkspace: need 3*N, prefer 2*N+N*NB)
 748 *                 (RWorkspace: 0)
 749 *
 750                   CALL ZUNGBR( 'Q', M, N, N, A, LDA, WORK( ITAUQ ),
 751      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 752                   IRWORK = IE + N
 753 *
 754 *                 Perform bidiagonal QR iteration, computing left
 755 *                 singular vectors of A in A
 756 *                 (CWorkspace: need 0)
 757 *                 (RWorkspace: need BDSPAC)
 758 *
 759                   CALL ZBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM, 1,
 760      $                         A, LDA, CDUM, 1, RWORK( IRWORK ), INFO )
 761 *
 762                END IF
 763 *
 764             ELSE IF( WNTUO .AND. WNTVAS ) THEN
 765 *
 766 *              Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A')
 767 *              N left singular vectors to be overwritten on A and
 768 *              N right singular vectors to be computed in VT
 769 *
 770                IF( LWORK.GE.N*N+3*N ) THEN
 771 *
 772 *                 Sufficient workspace for a fast algorithm
 773 *
 774                   IR = 1
 775                   IF( LWORK.GE.MAX( WRKBL, LDA*N )+LDA*N ) THEN
 776 *
 777 *                    WORK(IU) is LDA by N and WORK(IR) is LDA by N
 778 *
 779                      LDWRKU = LDA
 780                      LDWRKR = LDA
 781                   ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N )+N*N ) THEN
 782 *
 783 *                    WORK(IU) is LDA by N and WORK(IR) is N by N
 784 *
 785                      LDWRKU = LDA
 786                      LDWRKR = N
 787                   ELSE
 788 *
 789 *                    WORK(IU) is LDWRKU by N and WORK(IR) is N by N
 790 *
 791                      LDWRKU = ( LWORK-N*N ) / N
 792                      LDWRKR = N
 793                   END IF
 794                   ITAU = IR + LDWRKR*N
 795                   IWORK = ITAU + N
 796 *
 797 *                 Compute A=Q*R
 798 *                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
 799 *                 (RWorkspace: 0)
 800 *
 801                   CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
 802      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 803 *
 804 *                 Copy R to VT, zeroing out below it
 805 *
 806                   CALL ZLACPY( 'U', N, N, A, LDA, VT, LDVT )
 807                   IF( N.GT.1 )
 808      $               CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
 809      $                            VT( 21 ), LDVT )
 810 *
 811 *                 Generate Q in A
 812 *                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
 813 *                 (RWorkspace: 0)
 814 *
 815                   CALL ZUNGQR( M, N, N, A, LDA, WORK( ITAU ),
 816      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 817                   IE = 1
 818                   ITAUQ = ITAU
 819                   ITAUP = ITAUQ + N
 820                   IWORK = ITAUP + N
 821 *
 822 *                 Bidiagonalize R in VT, copying result to WORK(IR)
 823 *                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
 824 *                 (RWorkspace: need N)
 825 *
 826                   CALL ZGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
 827      $                         WORK( ITAUQ ), WORK( ITAUP ),
 828      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 829                   CALL ZLACPY( 'L', N, N, VT, LDVT, WORK( IR ), LDWRKR )
 830 *
 831 *                 Generate left vectors bidiagonalizing R in WORK(IR)
 832 *                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
 833 *                 (RWorkspace: 0)
 834 *
 835                   CALL ZUNGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
 836      $                         WORK( ITAUQ ), WORK( IWORK ),
 837      $                         LWORK-IWORK+1, IERR )
 838 *
 839 *                 Generate right vectors bidiagonalizing R in VT
 840 *                 (CWorkspace: need N*N+3*N-1, prefer N*N+2*N+(N-1)*NB)
 841 *                 (RWorkspace: 0)
 842 *
 843                   CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
 844      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 845                   IRWORK = IE + N
 846 *
 847 *                 Perform bidiagonal QR iteration, computing left
 848 *                 singular vectors of R in WORK(IR) and computing right
 849 *                 singular vectors of R in VT
 850 *                 (CWorkspace: need N*N)
 851 *                 (RWorkspace: need BDSPAC)
 852 *
 853                   CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ), VT,
 854      $                         LDVT, WORK( IR ), LDWRKR, CDUM, 1,
 855      $                         RWORK( IRWORK ), INFO )
 856                   IU = ITAUQ
 857 *
 858 *                 Multiply Q in A by left singular vectors of R in
 859 *                 WORK(IR), storing result in WORK(IU) and copying to A
 860 *                 (CWorkspace: need N*N+N, prefer N*N+M*N)
 861 *                 (RWorkspace: 0)
 862 *
 863                   DO 20 I = 1, M, LDWRKU
 864                      CHUNK = MIN( M-I+1, LDWRKU )
 865                      CALL ZGEMM( 'N''N', CHUNK, N, N, CONE, A( I, 1 ),
 866      $                           LDA, WORK( IR ), LDWRKR, CZERO,
 867      $                           WORK( IU ), LDWRKU )
 868                      CALL ZLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
 869      $                            A( I, 1 ), LDA )
 870    20             CONTINUE
 871 *
 872                ELSE
 873 *
 874 *                 Insufficient workspace for a fast algorithm
 875 *
 876                   ITAU = 1
 877                   IWORK = ITAU + N
 878 *
 879 *                 Compute A=Q*R
 880 *                 (CWorkspace: need 2*N, prefer N+N*NB)
 881 *                 (RWorkspace: 0)
 882 *
 883                   CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
 884      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 885 *
 886 *                 Copy R to VT, zeroing out below it
 887 *
 888                   CALL ZLACPY( 'U', N, N, A, LDA, VT, LDVT )
 889                   IF( N.GT.1 )
 890      $               CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
 891      $                            VT( 21 ), LDVT )
 892 *
 893 *                 Generate Q in A
 894 *                 (CWorkspace: need 2*N, prefer N+N*NB)
 895 *                 (RWorkspace: 0)
 896 *
 897                   CALL ZUNGQR( M, N, N, A, LDA, WORK( ITAU ),
 898      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 899                   IE = 1
 900                   ITAUQ = ITAU
 901                   ITAUP = ITAUQ + N
 902                   IWORK = ITAUP + N
 903 *
 904 *                 Bidiagonalize R in VT
 905 *                 (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
 906 *                 (RWorkspace: N)
 907 *
 908                   CALL ZGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
 909      $                         WORK( ITAUQ ), WORK( ITAUP ),
 910      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 911 *
 912 *                 Multiply Q in A by left vectors bidiagonalizing R
 913 *                 (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
 914 *                 (RWorkspace: 0)
 915 *
 916                   CALL ZUNMBR( 'Q''R''N', M, N, N, VT, LDVT,
 917      $                         WORK( ITAUQ ), A, LDA, WORK( IWORK ),
 918      $                         LWORK-IWORK+1, IERR )
 919 *
 920 *                 Generate right vectors bidiagonalizing R in VT
 921 *                 (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
 922 *                 (RWorkspace: 0)
 923 *
 924                   CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
 925      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
 926                   IRWORK = IE + N
 927 *
 928 *                 Perform bidiagonal QR iteration, computing left
 929 *                 singular vectors of A in A and computing right
 930 *                 singular vectors of A in VT
 931 *                 (CWorkspace: 0)
 932 *                 (RWorkspace: need BDSPAC)
 933 *
 934                   CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), VT,
 935      $                         LDVT, A, LDA, CDUM, 1, RWORK( IRWORK ),
 936      $                         INFO )
 937 *
 938                END IF
 939 *
 940             ELSE IF( WNTUS ) THEN
 941 *
 942                IF( WNTVN ) THEN
 943 *
 944 *                 Path 4 (M much larger than N, JOBU='S', JOBVT='N')
 945 *                 N left singular vectors to be computed in U and
 946 *                 no right singular vectors to be computed
 947 *
 948                   IF( LWORK.GE.N*N+3*N ) THEN
 949 *
 950 *                    Sufficient workspace for a fast algorithm
 951 *
 952                      IR = 1
 953                      IF( LWORK.GE.WRKBL+LDA*N ) THEN
 954 *
 955 *                       WORK(IR) is LDA by N
 956 *
 957                         LDWRKR = LDA
 958                      ELSE
 959 *
 960 *                       WORK(IR) is N by N
 961 *
 962                         LDWRKR = N
 963                      END IF
 964                      ITAU = IR + LDWRKR*N
 965                      IWORK = ITAU + N
 966 *
 967 *                    Compute A=Q*R
 968 *                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
 969 *                    (RWorkspace: 0)
 970 *
 971                      CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
 972      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
 973 *
 974 *                    Copy R to WORK(IR), zeroing out below it
 975 *
 976                      CALL ZLACPY( 'U', N, N, A, LDA, WORK( IR ),
 977      $                            LDWRKR )
 978                      CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
 979      $                            WORK( IR+1 ), LDWRKR )
 980 *
 981 *                    Generate Q in A
 982 *                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
 983 *                    (RWorkspace: 0)
 984 *
 985                      CALL ZUNGQR( M, N, N, A, LDA, WORK( ITAU ),
 986      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
 987                      IE = 1
 988                      ITAUQ = ITAU
 989                      ITAUP = ITAUQ + N
 990                      IWORK = ITAUP + N
 991 *
 992 *                    Bidiagonalize R in WORK(IR)
 993 *                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
 994 *                    (RWorkspace: need N)
 995 *
 996                      CALL ZGEBRD( N, N, WORK( IR ), LDWRKR, S,
 997      $                            RWORK( IE ), WORK( ITAUQ ),
 998      $                            WORK( ITAUP ), WORK( IWORK ),
 999      $                            LWORK-IWORK+1, IERR )
1000 *
1001 *                    Generate left vectors bidiagonalizing R in WORK(IR)
1002 *                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
1003 *                    (RWorkspace: 0)
1004 *
1005                      CALL ZUNGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
1006      $                            WORK( ITAUQ ), WORK( IWORK ),
1007      $                            LWORK-IWORK+1, IERR )
1008                      IRWORK = IE + N
1009 *
1010 *                    Perform bidiagonal QR iteration, computing left
1011 *                    singular vectors of R in WORK(IR)
1012 *                    (CWorkspace: need N*N)
1013 *                    (RWorkspace: need BDSPAC)
1014 *
1015                      CALL ZBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM,
1016      $                            1, WORK( IR ), LDWRKR, CDUM, 1,
1017      $                            RWORK( IRWORK ), INFO )
1018 *
1019 *                    Multiply Q in A by left singular vectors of R in
1020 *                    WORK(IR), storing result in U
1021 *                    (CWorkspace: need N*N)
1022 *                    (RWorkspace: 0)
1023 *
1024                      CALL ZGEMM( 'N''N', M, N, N, CONE, A, LDA,
1025      $                           WORK( IR ), LDWRKR, CZERO, U, LDU )
1026 *
1027                   ELSE
1028 *
1029 *                    Insufficient workspace for a fast algorithm
1030 *
1031                      ITAU = 1
1032                      IWORK = ITAU + N
1033 *
1034 *                    Compute A=Q*R, copying result to U
1035 *                    (CWorkspace: need 2*N, prefer N+N*NB)
1036 *                    (RWorkspace: 0)
1037 *
1038                      CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
1039      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1040                      CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
1041 *
1042 *                    Generate Q in U
1043 *                    (CWorkspace: need 2*N, prefer N+N*NB)
1044 *                    (RWorkspace: 0)
1045 *
1046                      CALL ZUNGQR( M, N, N, U, LDU, WORK( ITAU ),
1047      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1048                      IE = 1
1049                      ITAUQ = ITAU
1050                      ITAUP = ITAUQ + N
1051                      IWORK = ITAUP + N
1052 *
1053 *                    Zero out below R in A
1054 *
1055                      CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
1056      $                            A( 21 ), LDA )
1057 *
1058 *                    Bidiagonalize R in A
1059 *                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
1060 *                    (RWorkspace: need N)
1061 *
1062                      CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ),
1063      $                            WORK( ITAUQ ), WORK( ITAUP ),
1064      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1065 *
1066 *                    Multiply Q in U by left vectors bidiagonalizing R
1067 *                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
1068 *                    (RWorkspace: 0)
1069 *
1070                      CALL ZUNMBR( 'Q''R''N', M, N, N, A, LDA,
1071      $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1072      $                            LWORK-IWORK+1, IERR )
1073                      IRWORK = IE + N
1074 *
1075 *                    Perform bidiagonal QR iteration, computing left
1076 *                    singular vectors of A in U
1077 *                    (CWorkspace: 0)
1078 *                    (RWorkspace: need BDSPAC)
1079 *
1080                      CALL ZBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM,
1081      $                            1, U, LDU, CDUM, 1, RWORK( IRWORK ),
1082      $                            INFO )
1083 *
1084                   END IF
1085 *
1086                ELSE IF( WNTVO ) THEN
1087 *
1088 *                 Path 5 (M much larger than N, JOBU='S', JOBVT='O')
1089 *                 N left singular vectors to be computed in U and
1090 *                 N right singular vectors to be overwritten on A
1091 *
1092                   IF( LWORK.GE.2*N*N+3*N ) THEN
1093 *
1094 *                    Sufficient workspace for a fast algorithm
1095 *
1096                      IU = 1
1097                      IF( LWORK.GE.WRKBL+2*LDA*N ) THEN
1098 *
1099 *                       WORK(IU) is LDA by N and WORK(IR) is LDA by N
1100 *
1101                         LDWRKU = LDA
1102                         IR = IU + LDWRKU*N
1103                         LDWRKR = LDA
1104                      ELSE IF( LWORK.GE.WRKBL+( LDA+N )*N ) THEN
1105 *
1106 *                       WORK(IU) is LDA by N and WORK(IR) is N by N
1107 *
1108                         LDWRKU = LDA
1109                         IR = IU + LDWRKU*N
1110                         LDWRKR = N
1111                      ELSE
1112 *
1113 *                       WORK(IU) is N by N and WORK(IR) is N by N
1114 *
1115                         LDWRKU = N
1116                         IR = IU + LDWRKU*N
1117                         LDWRKR = N
1118                      END IF
1119                      ITAU = IR + LDWRKR*N
1120                      IWORK = ITAU + N
1121 *
1122 *                    Compute A=Q*R
1123 *                    (CWorkspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
1124 *                    (RWorkspace: 0)
1125 *
1126                      CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
1127      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1128 *
1129 *                    Copy R to WORK(IU), zeroing out below it
1130 *
1131                      CALL ZLACPY( 'U', N, N, A, LDA, WORK( IU ),
1132      $                            LDWRKU )
1133                      CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
1134      $                            WORK( IU+1 ), LDWRKU )
1135 *
1136 *                    Generate Q in A
1137 *                    (CWorkspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
1138 *                    (RWorkspace: 0)
1139 *
1140                      CALL ZUNGQR( M, N, N, A, LDA, WORK( ITAU ),
1141      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1142                      IE = 1
1143                      ITAUQ = ITAU
1144                      ITAUP = ITAUQ + N
1145                      IWORK = ITAUP + N
1146 *
1147 *                    Bidiagonalize R in WORK(IU), copying result to
1148 *                    WORK(IR)
1149 *                    (CWorkspace: need   2*N*N+3*N,
1150 *                                 prefer 2*N*N+2*N+2*N*NB)
1151 *                    (RWorkspace: need   N)
1152 *
1153                      CALL ZGEBRD( N, N, WORK( IU ), LDWRKU, S,
1154      $                            RWORK( IE ), WORK( ITAUQ ),
1155      $                            WORK( ITAUP ), WORK( IWORK ),
1156      $                            LWORK-IWORK+1, IERR )
1157                      CALL ZLACPY( 'U', N, N, WORK( IU ), LDWRKU,
1158      $                            WORK( IR ), LDWRKR )
1159 *
1160 *                    Generate left bidiagonalizing vectors in WORK(IU)
1161 *                    (CWorkspace: need 2*N*N+3*N, prefer 2*N*N+2*N+N*NB)
1162 *                    (RWorkspace: 0)
1163 *
1164                      CALL ZUNGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
1165      $                            WORK( ITAUQ ), WORK( IWORK ),
1166      $                            LWORK-IWORK+1, IERR )
1167 *
1168 *                    Generate right bidiagonalizing vectors in WORK(IR)
1169 *                    (CWorkspace: need   2*N*N+3*N-1,
1170 *                                 prefer 2*N*N+2*N+(N-1)*NB)
1171 *                    (RWorkspace: 0)
1172 *
1173                      CALL ZUNGBR( 'P', N, N, N, WORK( IR ), LDWRKR,
1174      $                            WORK( ITAUP ), WORK( IWORK ),
1175      $                            LWORK-IWORK+1, IERR )
1176                      IRWORK = IE + N
1177 *
1178 *                    Perform bidiagonal QR iteration, computing left
1179 *                    singular vectors of R in WORK(IU) and computing
1180 *                    right singular vectors of R in WORK(IR)
1181 *                    (CWorkspace: need 2*N*N)
1182 *                    (RWorkspace: need BDSPAC)
1183 *
1184                      CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ),
1185      $                            WORK( IR ), LDWRKR, WORK( IU ),
1186      $                            LDWRKU, CDUM, 1, RWORK( IRWORK ),
1187      $                            INFO )
1188 *
1189 *                    Multiply Q in A by left singular vectors of R in
1190 *                    WORK(IU), storing result in U
1191 *                    (CWorkspace: need N*N)
1192 *                    (RWorkspace: 0)
1193 *
1194                      CALL ZGEMM( 'N''N', M, N, N, CONE, A, LDA,
1195      $                           WORK( IU ), LDWRKU, CZERO, U, LDU )
1196 *
1197 *                    Copy right singular vectors of R to A
1198 *                    (CWorkspace: need N*N)
1199 *                    (RWorkspace: 0)
1200 *
1201                      CALL ZLACPY( 'F', N, N, WORK( IR ), LDWRKR, A,
1202      $                            LDA )
1203 *
1204                   ELSE
1205 *
1206 *                    Insufficient workspace for a fast algorithm
1207 *
1208                      ITAU = 1
1209                      IWORK = ITAU + N
1210 *
1211 *                    Compute A=Q*R, copying result to U
1212 *                    (CWorkspace: need 2*N, prefer N+N*NB)
1213 *                    (RWorkspace: 0)
1214 *
1215                      CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
1216      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1217                      CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
1218 *
1219 *                    Generate Q in U
1220 *                    (CWorkspace: need 2*N, prefer N+N*NB)
1221 *                    (RWorkspace: 0)
1222 *
1223                      CALL ZUNGQR( M, N, N, U, LDU, WORK( ITAU ),
1224      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1225                      IE = 1
1226                      ITAUQ = ITAU
1227                      ITAUP = ITAUQ + N
1228                      IWORK = ITAUP + N
1229 *
1230 *                    Zero out below R in A
1231 *
1232                      CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
1233      $                            A( 21 ), LDA )
1234 *
1235 *                    Bidiagonalize R in A
1236 *                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
1237 *                    (RWorkspace: need N)
1238 *
1239                      CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ),
1240      $                            WORK( ITAUQ ), WORK( ITAUP ),
1241      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1242 *
1243 *                    Multiply Q in U by left vectors bidiagonalizing R
1244 *                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
1245 *                    (RWorkspace: 0)
1246 *
1247                      CALL ZUNMBR( 'Q''R''N', M, N, N, A, LDA,
1248      $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1249      $                            LWORK-IWORK+1, IERR )
1250 *
1251 *                    Generate right vectors bidiagonalizing R in A
1252 *                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
1253 *                    (RWorkspace: 0)
1254 *
1255                      CALL ZUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
1256      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1257                      IRWORK = IE + N
1258 *
1259 *                    Perform bidiagonal QR iteration, computing left
1260 *                    singular vectors of A in U and computing right
1261 *                    singular vectors of A in A
1262 *                    (CWorkspace: 0)
1263 *                    (RWorkspace: need BDSPAC)
1264 *
1265                      CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), A,
1266      $                            LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
1267      $                            INFO )
1268 *
1269                   END IF
1270 *
1271                ELSE IF( WNTVAS ) THEN
1272 *
1273 *                 Path 6 (M much larger than N, JOBU='S', JOBVT='S'
1274 *                         or 'A')
1275 *                 N left singular vectors to be computed in U and
1276 *                 N right singular vectors to be computed in VT
1277 *
1278                   IF( LWORK.GE.N*N+3*N ) THEN
1279 *
1280 *                    Sufficient workspace for a fast algorithm
1281 *
1282                      IU = 1
1283                      IF( LWORK.GE.WRKBL+LDA*N ) THEN
1284 *
1285 *                       WORK(IU) is LDA by N
1286 *
1287                         LDWRKU = LDA
1288                      ELSE
1289 *
1290 *                       WORK(IU) is N by N
1291 *
1292                         LDWRKU = N
1293                      END IF
1294                      ITAU = IU + LDWRKU*N
1295                      IWORK = ITAU + N
1296 *
1297 *                    Compute A=Q*R
1298 *                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
1299 *                    (RWorkspace: 0)
1300 *
1301                      CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
1302      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1303 *
1304 *                    Copy R to WORK(IU), zeroing out below it
1305 *
1306                      CALL ZLACPY( 'U', N, N, A, LDA, WORK( IU ),
1307      $                            LDWRKU )
1308                      CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
1309      $                            WORK( IU+1 ), LDWRKU )
1310 *
1311 *                    Generate Q in A
1312 *                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
1313 *                    (RWorkspace: 0)
1314 *
1315                      CALL ZUNGQR( M, N, N, A, LDA, WORK( ITAU ),
1316      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1317                      IE = 1
1318                      ITAUQ = ITAU
1319                      ITAUP = ITAUQ + N
1320                      IWORK = ITAUP + N
1321 *
1322 *                    Bidiagonalize R in WORK(IU), copying result to VT
1323 *                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
1324 *                    (RWorkspace: need N)
1325 *
1326                      CALL ZGEBRD( N, N, WORK( IU ), LDWRKU, S,
1327      $                            RWORK( IE ), WORK( ITAUQ ),
1328      $                            WORK( ITAUP ), WORK( IWORK ),
1329      $                            LWORK-IWORK+1, IERR )
1330                      CALL ZLACPY( 'U', N, N, WORK( IU ), LDWRKU, VT,
1331      $                            LDVT )
1332 *
1333 *                    Generate left bidiagonalizing vectors in WORK(IU)
1334 *                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
1335 *                    (RWorkspace: 0)
1336 *
1337                      CALL ZUNGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
1338      $                            WORK( ITAUQ ), WORK( IWORK ),
1339      $                            LWORK-IWORK+1, IERR )
1340 *
1341 *                    Generate right bidiagonalizing vectors in VT
1342 *                    (CWorkspace: need   N*N+3*N-1,
1343 *                                 prefer N*N+2*N+(N-1)*NB)
1344 *                    (RWorkspace: 0)
1345 *
1346                      CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
1347      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1348                      IRWORK = IE + N
1349 *
1350 *                    Perform bidiagonal QR iteration, computing left
1351 *                    singular vectors of R in WORK(IU) and computing
1352 *                    right singular vectors of R in VT
1353 *                    (CWorkspace: need N*N)
1354 *                    (RWorkspace: need BDSPAC)
1355 *
1356                      CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ), VT,
1357      $                            LDVT, WORK( IU ), LDWRKU, CDUM, 1,
1358      $                            RWORK( IRWORK ), INFO )
1359 *
1360 *                    Multiply Q in A by left singular vectors of R in
1361 *                    WORK(IU), storing result in U
1362 *                    (CWorkspace: need N*N)
1363 *                    (RWorkspace: 0)
1364 *
1365                      CALL ZGEMM( 'N''N', M, N, N, CONE, A, LDA,
1366      $                           WORK( IU ), LDWRKU, CZERO, U, LDU )
1367 *
1368                   ELSE
1369 *
1370 *                    Insufficient workspace for a fast algorithm
1371 *
1372                      ITAU = 1
1373                      IWORK = ITAU + N
1374 *
1375 *                    Compute A=Q*R, copying result to U
1376 *                    (CWorkspace: need 2*N, prefer N+N*NB)
1377 *                    (RWorkspace: 0)
1378 *
1379                      CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
1380      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1381                      CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
1382 *
1383 *                    Generate Q in U
1384 *                    (CWorkspace: need 2*N, prefer N+N*NB)
1385 *                    (RWorkspace: 0)
1386 *
1387                      CALL ZUNGQR( M, N, N, U, LDU, WORK( ITAU ),
1388      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1389 *
1390 *                    Copy R to VT, zeroing out below it
1391 *
1392                      CALL ZLACPY( 'U', N, N, A, LDA, VT, LDVT )
1393                      IF( N.GT.1 )
1394      $                  CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
1395      $                               VT( 21 ), LDVT )
1396                      IE = 1
1397                      ITAUQ = ITAU
1398                      ITAUP = ITAUQ + N
1399                      IWORK = ITAUP + N
1400 *
1401 *                    Bidiagonalize R in VT
1402 *                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
1403 *                    (RWorkspace: need N)
1404 *
1405                      CALL ZGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
1406      $                            WORK( ITAUQ ), WORK( ITAUP ),
1407      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1408 *
1409 *                    Multiply Q in U by left bidiagonalizing vectors
1410 *                    in VT
1411 *                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
1412 *                    (RWorkspace: 0)
1413 *
1414                      CALL ZUNMBR( 'Q''R''N', M, N, N, VT, LDVT,
1415      $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1416      $                            LWORK-IWORK+1, IERR )
1417 *
1418 *                    Generate right bidiagonalizing vectors in VT
1419 *                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
1420 *                    (RWorkspace: 0)
1421 *
1422                      CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
1423      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1424                      IRWORK = IE + N
1425 *
1426 *                    Perform bidiagonal QR iteration, computing left
1427 *                    singular vectors of A in U and computing right
1428 *                    singular vectors of A in VT
1429 *                    (CWorkspace: 0)
1430 *                    (RWorkspace: need BDSPAC)
1431 *
1432                      CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), VT,
1433      $                            LDVT, U, LDU, CDUM, 1,
1434      $                            RWORK( IRWORK ), INFO )
1435 *
1436                   END IF
1437 *
1438                END IF
1439 *
1440             ELSE IF( WNTUA ) THEN
1441 *
1442                IF( WNTVN ) THEN
1443 *
1444 *                 Path 7 (M much larger than N, JOBU='A', JOBVT='N')
1445 *                 M left singular vectors to be computed in U and
1446 *                 no right singular vectors to be computed
1447 *
1448                   IF( LWORK.GE.N*N+MAX( N+M, 3*N ) ) THEN
1449 *
1450 *                    Sufficient workspace for a fast algorithm
1451 *
1452                      IR = 1
1453                      IF( LWORK.GE.WRKBL+LDA*N ) THEN
1454 *
1455 *                       WORK(IR) is LDA by N
1456 *
1457                         LDWRKR = LDA
1458                      ELSE
1459 *
1460 *                       WORK(IR) is N by N
1461 *
1462                         LDWRKR = N
1463                      END IF
1464                      ITAU = IR + LDWRKR*N
1465                      IWORK = ITAU + N
1466 *
1467 *                    Compute A=Q*R, copying result to U
1468 *                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
1469 *                    (RWorkspace: 0)
1470 *
1471                      CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
1472      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1473                      CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
1474 *
1475 *                    Copy R to WORK(IR), zeroing out below it
1476 *
1477                      CALL ZLACPY( 'U', N, N, A, LDA, WORK( IR ),
1478      $                            LDWRKR )
1479                      CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
1480      $                            WORK( IR+1 ), LDWRKR )
1481 *
1482 *                    Generate Q in U
1483 *                    (CWorkspace: need N*N+N+M, prefer N*N+N+M*NB)
1484 *                    (RWorkspace: 0)
1485 *
1486                      CALL ZUNGQR( M, M, N, U, LDU, WORK( ITAU ),
1487      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1488                      IE = 1
1489                      ITAUQ = ITAU
1490                      ITAUP = ITAUQ + N
1491                      IWORK = ITAUP + N
1492 *
1493 *                    Bidiagonalize R in WORK(IR)
1494 *                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
1495 *                    (RWorkspace: need N)
1496 *
1497                      CALL ZGEBRD( N, N, WORK( IR ), LDWRKR, S,
1498      $                            RWORK( IE ), WORK( ITAUQ ),
1499      $                            WORK( ITAUP ), WORK( IWORK ),
1500      $                            LWORK-IWORK+1, IERR )
1501 *
1502 *                    Generate left bidiagonalizing vectors in WORK(IR)
1503 *                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
1504 *                    (RWorkspace: 0)
1505 *
1506                      CALL ZUNGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
1507      $                            WORK( ITAUQ ), WORK( IWORK ),
1508      $                            LWORK-IWORK+1, IERR )
1509                      IRWORK = IE + N
1510 *
1511 *                    Perform bidiagonal QR iteration, computing left
1512 *                    singular vectors of R in WORK(IR)
1513 *                    (CWorkspace: need N*N)
1514 *                    (RWorkspace: need BDSPAC)
1515 *
1516                      CALL ZBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM,
1517      $                            1, WORK( IR ), LDWRKR, CDUM, 1,
1518      $                            RWORK( IRWORK ), INFO )
1519 *
1520 *                    Multiply Q in U by left singular vectors of R in
1521 *                    WORK(IR), storing result in A
1522 *                    (CWorkspace: need N*N)
1523 *                    (RWorkspace: 0)
1524 *
1525                      CALL ZGEMM( 'N''N', M, N, N, CONE, U, LDU,
1526      $                           WORK( IR ), LDWRKR, CZERO, A, LDA )
1527 *
1528 *                    Copy left singular vectors of A from A to U
1529 *
1530                      CALL ZLACPY( 'F', M, N, A, LDA, U, LDU )
1531 *
1532                   ELSE
1533 *
1534 *                    Insufficient workspace for a fast algorithm
1535 *
1536                      ITAU = 1
1537                      IWORK = ITAU + N
1538 *
1539 *                    Compute A=Q*R, copying result to U
1540 *                    (CWorkspace: need 2*N, prefer N+N*NB)
1541 *                    (RWorkspace: 0)
1542 *
1543                      CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
1544      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1545                      CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
1546 *
1547 *                    Generate Q in U
1548 *                    (CWorkspace: need N+M, prefer N+M*NB)
1549 *                    (RWorkspace: 0)
1550 *
1551                      CALL ZUNGQR( M, M, N, U, LDU, WORK( ITAU ),
1552      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1553                      IE = 1
1554                      ITAUQ = ITAU
1555                      ITAUP = ITAUQ + N
1556                      IWORK = ITAUP + N
1557 *
1558 *                    Zero out below R in A
1559 *
1560                      CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
1561      $                            A( 21 ), LDA )
1562 *
1563 *                    Bidiagonalize R in A
1564 *                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
1565 *                    (RWorkspace: need N)
1566 *
1567                      CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ),
1568      $                            WORK( ITAUQ ), WORK( ITAUP ),
1569      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1570 *
1571 *                    Multiply Q in U by left bidiagonalizing vectors
1572 *                    in A
1573 *                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
1574 *                    (RWorkspace: 0)
1575 *
1576                      CALL ZUNMBR( 'Q''R''N', M, N, N, A, LDA,
1577      $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1578      $                            LWORK-IWORK+1, IERR )
1579                      IRWORK = IE + N
1580 *
1581 *                    Perform bidiagonal QR iteration, computing left
1582 *                    singular vectors of A in U
1583 *                    (CWorkspace: 0)
1584 *                    (RWorkspace: need BDSPAC)
1585 *
1586                      CALL ZBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM,
1587      $                            1, U, LDU, CDUM, 1, RWORK( IRWORK ),
1588      $                            INFO )
1589 *
1590                   END IF
1591 *
1592                ELSE IF( WNTVO ) THEN
1593 *
1594 *                 Path 8 (M much larger than N, JOBU='A', JOBVT='O')
1595 *                 M left singular vectors to be computed in U and
1596 *                 N right singular vectors to be overwritten on A
1597 *
1598                   IF( LWORK.GE.2*N*N+MAX( N+M, 3*N ) ) THEN
1599 *
1600 *                    Sufficient workspace for a fast algorithm
1601 *
1602                      IU = 1
1603                      IF( LWORK.GE.WRKBL+2*LDA*N ) THEN
1604 *
1605 *                       WORK(IU) is LDA by N and WORK(IR) is LDA by N
1606 *
1607                         LDWRKU = LDA
1608                         IR = IU + LDWRKU*N
1609                         LDWRKR = LDA
1610                      ELSE IF( LWORK.GE.WRKBL+( LDA+N )*N ) THEN
1611 *
1612 *                       WORK(IU) is LDA by N and WORK(IR) is N by N
1613 *
1614                         LDWRKU = LDA
1615                         IR = IU + LDWRKU*N
1616                         LDWRKR = N
1617                      ELSE
1618 *
1619 *                       WORK(IU) is N by N and WORK(IR) is N by N
1620 *
1621                         LDWRKU = N
1622                         IR = IU + LDWRKU*N
1623                         LDWRKR = N
1624                      END IF
1625                      ITAU = IR + LDWRKR*N
1626                      IWORK = ITAU + N
1627 *
1628 *                    Compute A=Q*R, copying result to U
1629 *                    (CWorkspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
1630 *                    (RWorkspace: 0)
1631 *
1632                      CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
1633      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1634                      CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
1635 *
1636 *                    Generate Q in U
1637 *                    (CWorkspace: need 2*N*N+N+M, prefer 2*N*N+N+M*NB)
1638 *                    (RWorkspace: 0)
1639 *
1640                      CALL ZUNGQR( M, M, N, U, LDU, WORK( ITAU ),
1641      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1642 *
1643 *                    Copy R to WORK(IU), zeroing out below it
1644 *
1645                      CALL ZLACPY( 'U', N, N, A, LDA, WORK( IU ),
1646      $                            LDWRKU )
1647                      CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
1648      $                            WORK( IU+1 ), LDWRKU )
1649                      IE = 1
1650                      ITAUQ = ITAU
1651                      ITAUP = ITAUQ + N
1652                      IWORK = ITAUP + N
1653 *
1654 *                    Bidiagonalize R in WORK(IU), copying result to
1655 *                    WORK(IR)
1656 *                    (CWorkspace: need   2*N*N+3*N,
1657 *                                 prefer 2*N*N+2*N+2*N*NB)
1658 *                    (RWorkspace: need   N)
1659 *
1660                      CALL ZGEBRD( N, N, WORK( IU ), LDWRKU, S,
1661      $                            RWORK( IE ), WORK( ITAUQ ),
1662      $                            WORK( ITAUP ), WORK( IWORK ),
1663      $                            LWORK-IWORK+1, IERR )
1664                      CALL ZLACPY( 'U', N, N, WORK( IU ), LDWRKU,
1665      $                            WORK( IR ), LDWRKR )
1666 *
1667 *                    Generate left bidiagonalizing vectors in WORK(IU)
1668 *                    (CWorkspace: need 2*N*N+3*N, prefer 2*N*N+2*N+N*NB)
1669 *                    (RWorkspace: 0)
1670 *
1671                      CALL ZUNGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
1672      $                            WORK( ITAUQ ), WORK( IWORK ),
1673      $                            LWORK-IWORK+1, IERR )
1674 *
1675 *                    Generate right bidiagonalizing vectors in WORK(IR)
1676 *                    (CWorkspace: need   2*N*N+3*N-1,
1677 *                                 prefer 2*N*N+2*N+(N-1)*NB)
1678 *                    (RWorkspace: 0)
1679 *
1680                      CALL ZUNGBR( 'P', N, N, N, WORK( IR ), LDWRKR,
1681      $                            WORK( ITAUP ), WORK( IWORK ),
1682      $                            LWORK-IWORK+1, IERR )
1683                      IRWORK = IE + N
1684 *
1685 *                    Perform bidiagonal QR iteration, computing left
1686 *                    singular vectors of R in WORK(IU) and computing
1687 *                    right singular vectors of R in WORK(IR)
1688 *                    (CWorkspace: need 2*N*N)
1689 *                    (RWorkspace: need BDSPAC)
1690 *
1691                      CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ),
1692      $                            WORK( IR ), LDWRKR, WORK( IU ),
1693      $                            LDWRKU, CDUM, 1, RWORK( IRWORK ),
1694      $                            INFO )
1695 *
1696 *                    Multiply Q in U by left singular vectors of R in
1697 *                    WORK(IU), storing result in A
1698 *                    (CWorkspace: need N*N)
1699 *                    (RWorkspace: 0)
1700 *
1701                      CALL ZGEMM( 'N''N', M, N, N, CONE, U, LDU,
1702      $                           WORK( IU ), LDWRKU, CZERO, A, LDA )
1703 *
1704 *                    Copy left singular vectors of A from A to U
1705 *
1706                      CALL ZLACPY( 'F', M, N, A, LDA, U, LDU )
1707 *
1708 *                    Copy right singular vectors of R from WORK(IR) to A
1709 *
1710                      CALL ZLACPY( 'F', N, N, WORK( IR ), LDWRKR, A,
1711      $                            LDA )
1712 *
1713                   ELSE
1714 *
1715 *                    Insufficient workspace for a fast algorithm
1716 *
1717                      ITAU = 1
1718                      IWORK = ITAU + N
1719 *
1720 *                    Compute A=Q*R, copying result to U
1721 *                    (CWorkspace: need 2*N, prefer N+N*NB)
1722 *                    (RWorkspace: 0)
1723 *
1724                      CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
1725      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1726                      CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
1727 *
1728 *                    Generate Q in U
1729 *                    (CWorkspace: need N+M, prefer N+M*NB)
1730 *                    (RWorkspace: 0)
1731 *
1732                      CALL ZUNGQR( M, M, N, U, LDU, WORK( ITAU ),
1733      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1734                      IE = 1
1735                      ITAUQ = ITAU
1736                      ITAUP = ITAUQ + N
1737                      IWORK = ITAUP + N
1738 *
1739 *                    Zero out below R in A
1740 *
1741                      CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
1742      $                            A( 21 ), LDA )
1743 *
1744 *                    Bidiagonalize R in A
1745 *                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
1746 *                    (RWorkspace: need N)
1747 *
1748                      CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ),
1749      $                            WORK( ITAUQ ), WORK( ITAUP ),
1750      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1751 *
1752 *                    Multiply Q in U by left bidiagonalizing vectors
1753 *                    in A
1754 *                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
1755 *                    (RWorkspace: 0)
1756 *
1757                      CALL ZUNMBR( 'Q''R''N', M, N, N, A, LDA,
1758      $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1759      $                            LWORK-IWORK+1, IERR )
1760 *
1761 *                    Generate right bidiagonalizing vectors in A
1762 *                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
1763 *                    (RWorkspace: 0)
1764 *
1765                      CALL ZUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
1766      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1767                      IRWORK = IE + N
1768 *
1769 *                    Perform bidiagonal QR iteration, computing left
1770 *                    singular vectors of A in U and computing right
1771 *                    singular vectors of A in A
1772 *                    (CWorkspace: 0)
1773 *                    (RWorkspace: need BDSPAC)
1774 *
1775                      CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), A,
1776      $                            LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
1777      $                            INFO )
1778 *
1779                   END IF
1780 *
1781                ELSE IF( WNTVAS ) THEN
1782 *
1783 *                 Path 9 (M much larger than N, JOBU='A', JOBVT='S'
1784 *                         or 'A')
1785 *                 M left singular vectors to be computed in U and
1786 *                 N right singular vectors to be computed in VT
1787 *
1788                   IF( LWORK.GE.N*N+MAX( N+M, 3*N ) ) THEN
1789 *
1790 *                    Sufficient workspace for a fast algorithm
1791 *
1792                      IU = 1
1793                      IF( LWORK.GE.WRKBL+LDA*N ) THEN
1794 *
1795 *                       WORK(IU) is LDA by N
1796 *
1797                         LDWRKU = LDA
1798                      ELSE
1799 *
1800 *                       WORK(IU) is N by N
1801 *
1802                         LDWRKU = N
1803                      END IF
1804                      ITAU = IU + LDWRKU*N
1805                      IWORK = ITAU + N
1806 *
1807 *                    Compute A=Q*R, copying result to U
1808 *                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
1809 *                    (RWorkspace: 0)
1810 *
1811                      CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
1812      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1813                      CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
1814 *
1815 *                    Generate Q in U
1816 *                    (CWorkspace: need N*N+N+M, prefer N*N+N+M*NB)
1817 *                    (RWorkspace: 0)
1818 *
1819                      CALL ZUNGQR( M, M, N, U, LDU, WORK( ITAU ),
1820      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1821 *
1822 *                    Copy R to WORK(IU), zeroing out below it
1823 *
1824                      CALL ZLACPY( 'U', N, N, A, LDA, WORK( IU ),
1825      $                            LDWRKU )
1826                      CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
1827      $                            WORK( IU+1 ), LDWRKU )
1828                      IE = 1
1829                      ITAUQ = ITAU
1830                      ITAUP = ITAUQ + N
1831                      IWORK = ITAUP + N
1832 *
1833 *                    Bidiagonalize R in WORK(IU), copying result to VT
1834 *                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
1835 *                    (RWorkspace: need N)
1836 *
1837                      CALL ZGEBRD( N, N, WORK( IU ), LDWRKU, S,
1838      $                            RWORK( IE ), WORK( ITAUQ ),
1839      $                            WORK( ITAUP ), WORK( IWORK ),
1840      $                            LWORK-IWORK+1, IERR )
1841                      CALL ZLACPY( 'U', N, N, WORK( IU ), LDWRKU, VT,
1842      $                            LDVT )
1843 *
1844 *                    Generate left bidiagonalizing vectors in WORK(IU)
1845 *                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
1846 *                    (RWorkspace: 0)
1847 *
1848                      CALL ZUNGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
1849      $                            WORK( ITAUQ ), WORK( IWORK ),
1850      $                            LWORK-IWORK+1, IERR )
1851 *
1852 *                    Generate right bidiagonalizing vectors in VT
1853 *                    (CWorkspace: need   N*N+3*N-1,
1854 *                                 prefer N*N+2*N+(N-1)*NB)
1855 *                    (RWorkspace: need   0)
1856 *
1857                      CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
1858      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1859                      IRWORK = IE + N
1860 *
1861 *                    Perform bidiagonal QR iteration, computing left
1862 *                    singular vectors of R in WORK(IU) and computing
1863 *                    right singular vectors of R in VT
1864 *                    (CWorkspace: need N*N)
1865 *                    (RWorkspace: need BDSPAC)
1866 *
1867                      CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ), VT,
1868      $                            LDVT, WORK( IU ), LDWRKU, CDUM, 1,
1869      $                            RWORK( IRWORK ), INFO )
1870 *
1871 *                    Multiply Q in U by left singular vectors of R in
1872 *                    WORK(IU), storing result in A
1873 *                    (CWorkspace: need N*N)
1874 *                    (RWorkspace: 0)
1875 *
1876                      CALL ZGEMM( 'N''N', M, N, N, CONE, U, LDU,
1877      $                           WORK( IU ), LDWRKU, CZERO, A, LDA )
1878 *
1879 *                    Copy left singular vectors of A from A to U
1880 *
1881                      CALL ZLACPY( 'F', M, N, A, LDA, U, LDU )
1882 *
1883                   ELSE
1884 *
1885 *                    Insufficient workspace for a fast algorithm
1886 *
1887                      ITAU = 1
1888                      IWORK = ITAU + N
1889 *
1890 *                    Compute A=Q*R, copying result to U
1891 *                    (CWorkspace: need 2*N, prefer N+N*NB)
1892 *                    (RWorkspace: 0)
1893 *
1894                      CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
1895      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1896                      CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
1897 *
1898 *                    Generate Q in U
1899 *                    (CWorkspace: need N+M, prefer N+M*NB)
1900 *                    (RWorkspace: 0)
1901 *
1902                      CALL ZUNGQR( M, M, N, U, LDU, WORK( ITAU ),
1903      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1904 *
1905 *                    Copy R from A to VT, zeroing out below it
1906 *
1907                      CALL ZLACPY( 'U', N, N, A, LDA, VT, LDVT )
1908                      IF( N.GT.1 )
1909      $                  CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
1910      $                               VT( 21 ), LDVT )
1911                      IE = 1
1912                      ITAUQ = ITAU
1913                      ITAUP = ITAUQ + N
1914                      IWORK = ITAUP + N
1915 *
1916 *                    Bidiagonalize R in VT
1917 *                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
1918 *                    (RWorkspace: need N)
1919 *
1920                      CALL ZGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
1921      $                            WORK( ITAUQ ), WORK( ITAUP ),
1922      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1923 *
1924 *                    Multiply Q in U by left bidiagonalizing vectors
1925 *                    in VT
1926 *                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
1927 *                    (RWorkspace: 0)
1928 *
1929                      CALL ZUNMBR( 'Q''R''N', M, N, N, VT, LDVT,
1930      $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1931      $                            LWORK-IWORK+1, IERR )
1932 *
1933 *                    Generate right bidiagonalizing vectors in VT
1934 *                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
1935 *                    (RWorkspace: 0)
1936 *
1937                      CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
1938      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
1939                      IRWORK = IE + N
1940 *
1941 *                    Perform bidiagonal QR iteration, computing left
1942 *                    singular vectors of A in U and computing right
1943 *                    singular vectors of A in VT
1944 *                    (CWorkspace: 0)
1945 *                    (RWorkspace: need BDSPAC)
1946 *
1947                      CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), VT,
1948      $                            LDVT, U, LDU, CDUM, 1,
1949      $                            RWORK( IRWORK ), INFO )
1950 *
1951                   END IF
1952 *
1953                END IF
1954 *
1955             END IF
1956 *
1957          ELSE
1958 *
1959 *           M .LT. MNTHR
1960 *
1961 *           Path 10 (M at least N, but not much larger)
1962 *           Reduce to bidiagonal form without QR decomposition
1963 *
1964             IE = 1
1965             ITAUQ = 1
1966             ITAUP = ITAUQ + N
1967             IWORK = ITAUP + N
1968 *
1969 *           Bidiagonalize A
1970 *           (CWorkspace: need 2*N+M, prefer 2*N+(M+N)*NB)
1971 *           (RWorkspace: need N)
1972 *
1973             CALL ZGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
1974      $                   WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
1975      $                   IERR )
1976             IF( WNTUAS ) THEN
1977 *
1978 *              If left singular vectors desired in U, copy result to U
1979 *              and generate left bidiagonalizing vectors in U
1980 *              (CWorkspace: need 2*N+NCU, prefer 2*N+NCU*NB)
1981 *              (RWorkspace: 0)
1982 *
1983                CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
1984                IF( WNTUS )
1985      $            NCU = N
1986                IF( WNTUA )
1987      $            NCU = M
1988                CALL ZUNGBR( 'Q', M, NCU, N, U, LDU, WORK( ITAUQ ),
1989      $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
1990             END IF
1991             IF( WNTVAS ) THEN
1992 *
1993 *              If right singular vectors desired in VT, copy result to
1994 *              VT and generate right bidiagonalizing vectors in VT
1995 *              (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
1996 *              (RWorkspace: 0)
1997 *
1998                CALL ZLACPY( 'U', N, N, A, LDA, VT, LDVT )
1999                CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
2000      $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
2001             END IF
2002             IF( WNTUO ) THEN
2003 *
2004 *              If left singular vectors desired in A, generate left
2005 *              bidiagonalizing vectors in A
2006 *              (CWorkspace: need 3*N, prefer 2*N+N*NB)
2007 *              (RWorkspace: 0)
2008 *
2009                CALL ZUNGBR( 'Q', M, N, N, A, LDA, WORK( ITAUQ ),
2010      $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
2011             END IF
2012             IF( WNTVO ) THEN
2013 *
2014 *              If right singular vectors desired in A, generate right
2015 *              bidiagonalizing vectors in A
2016 *              (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
2017 *              (RWorkspace: 0)
2018 *
2019                CALL ZUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
2020      $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
2021             END IF
2022             IRWORK = IE + N
2023             IF( WNTUAS .OR. WNTUO )
2024      $         NRU = M
2025             IF( WNTUN )
2026      $         NRU = 0
2027             IF( WNTVAS .OR. WNTVO )
2028      $         NCVT = N
2029             IF( WNTVN )
2030      $         NCVT = 0
2031             IF( ( .NOT.WNTUO ) .AND. ( .NOT.WNTVO ) ) THEN
2032 *
2033 *              Perform bidiagonal QR iteration, if desired, computing
2034 *              left singular vectors in U and computing right singular
2035 *              vectors in VT
2036 *              (CWorkspace: 0)
2037 *              (RWorkspace: need BDSPAC)
2038 *
2039                CALL ZBDSQR( 'U', N, NCVT, NRU, 0, S, RWORK( IE ), VT,
2040      $                      LDVT, U, LDU, CDUM, 1, RWORK( IRWORK ),
2041      $                      INFO )
2042             ELSE IF( ( .NOT.WNTUO ) .AND. WNTVO ) THEN
2043 *
2044 *              Perform bidiagonal QR iteration, if desired, computing
2045 *              left singular vectors in U and computing right singular
2046 *              vectors in A
2047 *              (CWorkspace: 0)
2048 *              (RWorkspace: need BDSPAC)
2049 *
2050                CALL ZBDSQR( 'U', N, NCVT, NRU, 0, S, RWORK( IE ), A,
2051      $                      LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
2052      $                      INFO )
2053             ELSE
2054 *
2055 *              Perform bidiagonal QR iteration, if desired, computing
2056 *              left singular vectors in A and computing right singular
2057 *              vectors in VT
2058 *              (CWorkspace: 0)
2059 *              (RWorkspace: need BDSPAC)
2060 *
2061                CALL ZBDSQR( 'U', N, NCVT, NRU, 0, S, RWORK( IE ), VT,
2062      $                      LDVT, A, LDA, CDUM, 1, RWORK( IRWORK ),
2063      $                      INFO )
2064             END IF
2065 *
2066          END IF
2067 *
2068       ELSE
2069 *
2070 *        A has more columns than rows. If A has sufficiently more
2071 *        columns than rows, first reduce using the LQ decomposition (if
2072 *        sufficient workspace available)
2073 *
2074          IF( N.GE.MNTHR ) THEN
2075 *
2076             IF( WNTVN ) THEN
2077 *
2078 *              Path 1t(N much larger than M, JOBVT='N')
2079 *              No right singular vectors to be computed
2080 *
2081                ITAU = 1
2082                IWORK = ITAU + M
2083 *
2084 *              Compute A=L*Q
2085 *              (CWorkspace: need 2*M, prefer M+M*NB)
2086 *              (RWorkspace: 0)
2087 *
2088                CALL ZGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
2089      $                      LWORK-IWORK+1, IERR )
2090 *
2091 *              Zero out above L
2092 *
2093                CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, A( 12 ),
2094      $                      LDA )
2095                IE = 1
2096                ITAUQ = 1
2097                ITAUP = ITAUQ + M
2098                IWORK = ITAUP + M
2099 *
2100 *              Bidiagonalize L in A
2101 *              (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
2102 *              (RWorkspace: need M)
2103 *
2104                CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
2105      $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
2106      $                      IERR )
2107                IF( WNTUO .OR. WNTUAS ) THEN
2108 *
2109 *                 If left singular vectors desired, generate Q
2110 *                 (CWorkspace: need 3*M, prefer 2*M+M*NB)
2111 *                 (RWorkspace: 0)
2112 *
2113                   CALL ZUNGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
2114      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2115                END IF
2116                IRWORK = IE + M
2117                NRU = 0
2118                IF( WNTUO .OR. WNTUAS )
2119      $            NRU = M
2120 *
2121 *              Perform bidiagonal QR iteration, computing left singular
2122 *              vectors of A in A if desired
2123 *              (CWorkspace: 0)
2124 *              (RWorkspace: need BDSPAC)
2125 *
2126                CALL ZBDSQR( 'U', M, 0, NRU, 0, S, RWORK( IE ), CDUM, 1,
2127      $                      A, LDA, CDUM, 1, RWORK( IRWORK ), INFO )
2128 *
2129 *              If left singular vectors desired in U, copy them there
2130 *
2131                IF( WNTUAS )
2132      $            CALL ZLACPY( 'F', M, M, A, LDA, U, LDU )
2133 *
2134             ELSE IF( WNTVO .AND. WNTUN ) THEN
2135 *
2136 *              Path 2t(N much larger than M, JOBU='N', JOBVT='O')
2137 *              M right singular vectors to be overwritten on A and
2138 *              no left singular vectors to be computed
2139 *
2140                IF( LWORK.GE.M*M+3*M ) THEN
2141 *
2142 *                 Sufficient workspace for a fast algorithm
2143 *
2144                   IR = 1
2145                   IF( LWORK.GE.MAX( WRKBL, LDA*N )+LDA*M ) THEN
2146 *
2147 *                    WORK(IU) is LDA by N and WORK(IR) is LDA by M
2148 *
2149                      LDWRKU = LDA
2150                      CHUNK = N
2151                      LDWRKR = LDA
2152                   ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N )+M*M ) THEN
2153 *
2154 *                    WORK(IU) is LDA by N and WORK(IR) is M by M
2155 *
2156                      LDWRKU = LDA
2157                      CHUNK = N
2158                      LDWRKR = M
2159                   ELSE
2160 *
2161 *                    WORK(IU) is M by CHUNK and WORK(IR) is M by M
2162 *
2163                      LDWRKU = M
2164                      CHUNK = ( LWORK-M*M ) / M
2165                      LDWRKR = M
2166                   END IF
2167                   ITAU = IR + LDWRKR*M
2168                   IWORK = ITAU + M
2169 *
2170 *                 Compute A=L*Q
2171 *                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
2172 *                 (RWorkspace: 0)
2173 *
2174                   CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
2175      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2176 *
2177 *                 Copy L to WORK(IR) and zero out above it
2178 *
2179                   CALL ZLACPY( 'L', M, M, A, LDA, WORK( IR ), LDWRKR )
2180                   CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
2181      $                         WORK( IR+LDWRKR ), LDWRKR )
2182 *
2183 *                 Generate Q in A
2184 *                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
2185 *                 (RWorkspace: 0)
2186 *
2187                   CALL ZUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
2188      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2189                   IE = 1
2190                   ITAUQ = ITAU
2191                   ITAUP = ITAUQ + M
2192                   IWORK = ITAUP + M
2193 *
2194 *                 Bidiagonalize L in WORK(IR)
2195 *                 (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
2196 *                 (RWorkspace: need M)
2197 *
2198                   CALL ZGEBRD( M, M, WORK( IR ), LDWRKR, S, RWORK( IE ),
2199      $                         WORK( ITAUQ ), WORK( ITAUP ),
2200      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2201 *
2202 *                 Generate right vectors bidiagonalizing L
2203 *                 (CWorkspace: need M*M+3*M-1, prefer M*M+2*M+(M-1)*NB)
2204 *                 (RWorkspace: 0)
2205 *
2206                   CALL ZUNGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
2207      $                         WORK( ITAUP ), WORK( IWORK ),
2208      $                         LWORK-IWORK+1, IERR )
2209                   IRWORK = IE + M
2210 *
2211 *                 Perform bidiagonal QR iteration, computing right
2212 *                 singular vectors of L in WORK(IR)
2213 *                 (CWorkspace: need M*M)
2214 *                 (RWorkspace: need BDSPAC)
2215 *
2216                   CALL ZBDSQR( 'U', M, M, 00, S, RWORK( IE ),
2217      $                         WORK( IR ), LDWRKR, CDUM, 1, CDUM, 1,
2218      $                         RWORK( IRWORK ), INFO )
2219                   IU = ITAUQ
2220 *
2221 *                 Multiply right singular vectors of L in WORK(IR) by Q
2222 *                 in A, storing result in WORK(IU) and copying to A
2223 *                 (CWorkspace: need M*M+M, prefer M*M+M*N)
2224 *                 (RWorkspace: 0)
2225 *
2226                   DO 30 I = 1, N, CHUNK
2227                      BLK = MIN( N-I+1, CHUNK )
2228                      CALL ZGEMM( 'N''N', M, BLK, M, CONE, WORK( IR ),
2229      $                           LDWRKR, A( 1, I ), LDA, CZERO,
2230      $                           WORK( IU ), LDWRKU )
2231                      CALL ZLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
2232      $                            A( 1, I ), LDA )
2233    30             CONTINUE
2234 *
2235                ELSE
2236 *
2237 *                 Insufficient workspace for a fast algorithm
2238 *
2239                   IE = 1
2240                   ITAUQ = 1
2241                   ITAUP = ITAUQ + M
2242                   IWORK = ITAUP + M
2243 *
2244 *                 Bidiagonalize A
2245 *                 (CWorkspace: need 2*M+N, prefer 2*M+(M+N)*NB)
2246 *                 (RWorkspace: need M)
2247 *
2248                   CALL ZGEBRD( M, N, A, LDA, S, RWORK( IE ),
2249      $                         WORK( ITAUQ ), WORK( ITAUP ),
2250      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2251 *
2252 *                 Generate right vectors bidiagonalizing A
2253 *                 (CWorkspace: need 3*M, prefer 2*M+M*NB)
2254 *                 (RWorkspace: 0)
2255 *
2256                   CALL ZUNGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
2257      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2258                   IRWORK = IE + M
2259 *
2260 *                 Perform bidiagonal QR iteration, computing right
2261 *                 singular vectors of A in A
2262 *                 (CWorkspace: 0)
2263 *                 (RWorkspace: need BDSPAC)
2264 *
2265                   CALL ZBDSQR( 'L', M, N, 00, S, RWORK( IE ), A, LDA,
2266      $                         CDUM, 1, CDUM, 1, RWORK( IRWORK ), INFO )
2267 *
2268                END IF
2269 *
2270             ELSE IF( WNTVO .AND. WNTUAS ) THEN
2271 *
2272 *              Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O')
2273 *              M right singular vectors to be overwritten on A and
2274 *              M left singular vectors to be computed in U
2275 *
2276                IF( LWORK.GE.M*M+3*M ) THEN
2277 *
2278 *                 Sufficient workspace for a fast algorithm
2279 *
2280                   IR = 1
2281                   IF( LWORK.GE.MAX( WRKBL, LDA*N )+LDA*M ) THEN
2282 *
2283 *                    WORK(IU) is LDA by N and WORK(IR) is LDA by M
2284 *
2285                      LDWRKU = LDA
2286                      CHUNK = N
2287                      LDWRKR = LDA
2288                   ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N )+M*M ) THEN
2289 *
2290 *                    WORK(IU) is LDA by N and WORK(IR) is M by M
2291 *
2292                      LDWRKU = LDA
2293                      CHUNK = N
2294                      LDWRKR = M
2295                   ELSE
2296 *
2297 *                    WORK(IU) is M by CHUNK and WORK(IR) is M by M
2298 *
2299                      LDWRKU = M
2300                      CHUNK = ( LWORK-M*M ) / M
2301                      LDWRKR = M
2302                   END IF
2303                   ITAU = IR + LDWRKR*M
2304                   IWORK = ITAU + M
2305 *
2306 *                 Compute A=L*Q
2307 *                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
2308 *                 (RWorkspace: 0)
2309 *
2310                   CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
2311      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2312 *
2313 *                 Copy L to U, zeroing about above it
2314 *
2315                   CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
2316                   CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, U( 12 ),
2317      $                         LDU )
2318 *
2319 *                 Generate Q in A
2320 *                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
2321 *                 (RWorkspace: 0)
2322 *
2323                   CALL ZUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
2324      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2325                   IE = 1
2326                   ITAUQ = ITAU
2327                   ITAUP = ITAUQ + M
2328                   IWORK = ITAUP + M
2329 *
2330 *                 Bidiagonalize L in U, copying result to WORK(IR)
2331 *                 (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
2332 *                 (RWorkspace: need M)
2333 *
2334                   CALL ZGEBRD( M, M, U, LDU, S, RWORK( IE ),
2335      $                         WORK( ITAUQ ), WORK( ITAUP ),
2336      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2337                   CALL ZLACPY( 'U', M, M, U, LDU, WORK( IR ), LDWRKR )
2338 *
2339 *                 Generate right vectors bidiagonalizing L in WORK(IR)
2340 *                 (CWorkspace: need M*M+3*M-1, prefer M*M+2*M+(M-1)*NB)
2341 *                 (RWorkspace: 0)
2342 *
2343                   CALL ZUNGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
2344      $                         WORK( ITAUP ), WORK( IWORK ),
2345      $                         LWORK-IWORK+1, IERR )
2346 *
2347 *                 Generate left vectors bidiagonalizing L in U
2348 *                 (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
2349 *                 (RWorkspace: 0)
2350 *
2351                   CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
2352      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2353                   IRWORK = IE + M
2354 *
2355 *                 Perform bidiagonal QR iteration, computing left
2356 *                 singular vectors of L in U, and computing right
2357 *                 singular vectors of L in WORK(IR)
2358 *                 (CWorkspace: need M*M)
2359 *                 (RWorkspace: need BDSPAC)
2360 *
2361                   CALL ZBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
2362      $                         WORK( IR ), LDWRKR, U, LDU, CDUM, 1,
2363      $                         RWORK( IRWORK ), INFO )
2364                   IU = ITAUQ
2365 *
2366 *                 Multiply right singular vectors of L in WORK(IR) by Q
2367 *                 in A, storing result in WORK(IU) and copying to A
2368 *                 (CWorkspace: need M*M+M, prefer M*M+M*N))
2369 *                 (RWorkspace: 0)
2370 *
2371                   DO 40 I = 1, N, CHUNK
2372                      BLK = MIN( N-I+1, CHUNK )
2373                      CALL ZGEMM( 'N''N', M, BLK, M, CONE, WORK( IR ),
2374      $                           LDWRKR, A( 1, I ), LDA, CZERO,
2375      $                           WORK( IU ), LDWRKU )
2376                      CALL ZLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
2377      $                            A( 1, I ), LDA )
2378    40             CONTINUE
2379 *
2380                ELSE
2381 *
2382 *                 Insufficient workspace for a fast algorithm
2383 *
2384                   ITAU = 1
2385                   IWORK = ITAU + M
2386 *
2387 *                 Compute A=L*Q
2388 *                 (CWorkspace: need 2*M, prefer M+M*NB)
2389 *                 (RWorkspace: 0)
2390 *
2391                   CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
2392      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2393 *
2394 *                 Copy L to U, zeroing out above it
2395 *
2396                   CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
2397                   CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, U( 12 ),
2398      $                         LDU )
2399 *
2400 *                 Generate Q in A
2401 *                 (CWorkspace: need 2*M, prefer M+M*NB)
2402 *                 (RWorkspace: 0)
2403 *
2404                   CALL ZUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
2405      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2406                   IE = 1
2407                   ITAUQ = ITAU
2408                   ITAUP = ITAUQ + M
2409                   IWORK = ITAUP + M
2410 *
2411 *                 Bidiagonalize L in U
2412 *                 (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
2413 *                 (RWorkspace: need M)
2414 *
2415                   CALL ZGEBRD( M, M, U, LDU, S, RWORK( IE ),
2416      $                         WORK( ITAUQ ), WORK( ITAUP ),
2417      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2418 *
2419 *                 Multiply right vectors bidiagonalizing L by Q in A
2420 *                 (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
2421 *                 (RWorkspace: 0)
2422 *
2423                   CALL ZUNMBR( 'P''L''C', M, N, M, U, LDU,
2424      $                         WORK( ITAUP ), A, LDA, WORK( IWORK ),
2425      $                         LWORK-IWORK+1, IERR )
2426 *
2427 *                 Generate left vectors bidiagonalizing L in U
2428 *                 (CWorkspace: need 3*M, prefer 2*M+M*NB)
2429 *                 (RWorkspace: 0)
2430 *
2431                   CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
2432      $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
2433                   IRWORK = IE + M
2434 *
2435 *                 Perform bidiagonal QR iteration, computing left
2436 *                 singular vectors of A in U and computing right
2437 *                 singular vectors of A in A
2438 *                 (CWorkspace: 0)
2439 *                 (RWorkspace: need BDSPAC)
2440 *
2441                   CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), A, LDA,
2442      $                         U, LDU, CDUM, 1, RWORK( IRWORK ), INFO )
2443 *
2444                END IF
2445 *
2446             ELSE IF( WNTVS ) THEN
2447 *
2448                IF( WNTUN ) THEN
2449 *
2450 *                 Path 4t(N much larger than M, JOBU='N', JOBVT='S')
2451 *                 M right singular vectors to be computed in VT and
2452 *                 no left singular vectors to be computed
2453 *
2454                   IF( LWORK.GE.M*M+3*M ) THEN
2455 *
2456 *                    Sufficient workspace for a fast algorithm
2457 *
2458                      IR = 1
2459                      IF( LWORK.GE.WRKBL+LDA*M ) THEN
2460 *
2461 *                       WORK(IR) is LDA by M
2462 *
2463                         LDWRKR = LDA
2464                      ELSE
2465 *
2466 *                       WORK(IR) is M by M
2467 *
2468                         LDWRKR = M
2469                      END IF
2470                      ITAU = IR + LDWRKR*M
2471                      IWORK = ITAU + M
2472 *
2473 *                    Compute A=L*Q
2474 *                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
2475 *                    (RWorkspace: 0)
2476 *
2477                      CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
2478      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2479 *
2480 *                    Copy L to WORK(IR), zeroing out above it
2481 *
2482                      CALL ZLACPY( 'L', M, M, A, LDA, WORK( IR ),
2483      $                            LDWRKR )
2484                      CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
2485      $                            WORK( IR+LDWRKR ), LDWRKR )
2486 *
2487 *                    Generate Q in A
2488 *                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
2489 *                    (RWorkspace: 0)
2490 *
2491                      CALL ZUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
2492      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2493                      IE = 1
2494                      ITAUQ = ITAU
2495                      ITAUP = ITAUQ + M
2496                      IWORK = ITAUP + M
2497 *
2498 *                    Bidiagonalize L in WORK(IR)
2499 *                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
2500 *                    (RWorkspace: need M)
2501 *
2502                      CALL ZGEBRD( M, M, WORK( IR ), LDWRKR, S,
2503      $                            RWORK( IE ), WORK( ITAUQ ),
2504      $                            WORK( ITAUP ), WORK( IWORK ),
2505      $                            LWORK-IWORK+1, IERR )
2506 *
2507 *                    Generate right vectors bidiagonalizing L in
2508 *                    WORK(IR)
2509 *                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+(M-1)*NB)
2510 *                    (RWorkspace: 0)
2511 *
2512                      CALL ZUNGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
2513      $                            WORK( ITAUP ), WORK( IWORK ),
2514      $                            LWORK-IWORK+1, IERR )
2515                      IRWORK = IE + M
2516 *
2517 *                    Perform bidiagonal QR iteration, computing right
2518 *                    singular vectors of L in WORK(IR)
2519 *                    (CWorkspace: need M*M)
2520 *                    (RWorkspace: need BDSPAC)
2521 *
2522                      CALL ZBDSQR( 'U', M, M, 00, S, RWORK( IE ),
2523      $                            WORK( IR ), LDWRKR, CDUM, 1, CDUM, 1,
2524      $                            RWORK( IRWORK ), INFO )
2525 *
2526 *                    Multiply right singular vectors of L in WORK(IR) by
2527 *                    Q in A, storing result in VT
2528 *                    (CWorkspace: need M*M)
2529 *                    (RWorkspace: 0)
2530 *
2531                      CALL ZGEMM( 'N''N', M, N, M, CONE, WORK( IR ),
2532      $                           LDWRKR, A, LDA, CZERO, VT, LDVT )
2533 *
2534                   ELSE
2535 *
2536 *                    Insufficient workspace for a fast algorithm
2537 *
2538                      ITAU = 1
2539                      IWORK = ITAU + M
2540 *
2541 *                    Compute A=L*Q
2542 *                    (CWorkspace: need 2*M, prefer M+M*NB)
2543 *                    (RWorkspace: 0)
2544 *
2545                      CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
2546      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2547 *
2548 *                    Copy result to VT
2549 *
2550                      CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
2551 *
2552 *                    Generate Q in VT
2553 *                    (CWorkspace: need 2*M, prefer M+M*NB)
2554 *                    (RWorkspace: 0)
2555 *
2556                      CALL ZUNGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
2557      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2558                      IE = 1
2559                      ITAUQ = ITAU
2560                      ITAUP = ITAUQ + M
2561                      IWORK = ITAUP + M
2562 *
2563 *                    Zero out above L in A
2564 *
2565                      CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
2566      $                            A( 12 ), LDA )
2567 *
2568 *                    Bidiagonalize L in A
2569 *                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
2570 *                    (RWorkspace: need M)
2571 *
2572                      CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ),
2573      $                            WORK( ITAUQ ), WORK( ITAUP ),
2574      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2575 *
2576 *                    Multiply right vectors bidiagonalizing L by Q in VT
2577 *                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
2578 *                    (RWorkspace: 0)
2579 *
2580                      CALL ZUNMBR( 'P''L''C', M, N, M, A, LDA,
2581      $                            WORK( ITAUP ), VT, LDVT,
2582      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2583                      IRWORK = IE + M
2584 *
2585 *                    Perform bidiagonal QR iteration, computing right
2586 *                    singular vectors of A in VT
2587 *                    (CWorkspace: 0)
2588 *                    (RWorkspace: need BDSPAC)
2589 *
2590                      CALL ZBDSQR( 'U', M, N, 00, S, RWORK( IE ), VT,
2591      $                            LDVT, CDUM, 1, CDUM, 1,
2592      $                            RWORK( IRWORK ), INFO )
2593 *
2594                   END IF
2595 *
2596                ELSE IF( WNTUO ) THEN
2597 *
2598 *                 Path 5t(N much larger than M, JOBU='O', JOBVT='S')
2599 *                 M right singular vectors to be computed in VT and
2600 *                 M left singular vectors to be overwritten on A
2601 *
2602                   IF( LWORK.GE.2*M*M+3*M ) THEN
2603 *
2604 *                    Sufficient workspace for a fast algorithm
2605 *
2606                      IU = 1
2607                      IF( LWORK.GE.WRKBL+2*LDA*M ) THEN
2608 *
2609 *                       WORK(IU) is LDA by M and WORK(IR) is LDA by M
2610 *
2611                         LDWRKU = LDA
2612                         IR = IU + LDWRKU*M
2613                         LDWRKR = LDA
2614                      ELSE IF( LWORK.GE.WRKBL+( LDA+M )*M ) THEN
2615 *
2616 *                       WORK(IU) is LDA by M and WORK(IR) is M by M
2617 *
2618                         LDWRKU = LDA
2619                         IR = IU + LDWRKU*M
2620                         LDWRKR = M
2621                      ELSE
2622 *
2623 *                       WORK(IU) is M by M and WORK(IR) is M by M
2624 *
2625                         LDWRKU = M
2626                         IR = IU + LDWRKU*M
2627                         LDWRKR = M
2628                      END IF
2629                      ITAU = IR + LDWRKR*M
2630                      IWORK = ITAU + M
2631 *
2632 *                    Compute A=L*Q
2633 *                    (CWorkspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
2634 *                    (RWorkspace: 0)
2635 *
2636                      CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
2637      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2638 *
2639 *                    Copy L to WORK(IU), zeroing out below it
2640 *
2641                      CALL ZLACPY( 'L', M, M, A, LDA, WORK( IU ),
2642      $                            LDWRKU )
2643                      CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
2644      $                            WORK( IU+LDWRKU ), LDWRKU )
2645 *
2646 *                    Generate Q in A
2647 *                    (CWorkspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
2648 *                    (RWorkspace: 0)
2649 *
2650                      CALL ZUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
2651      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2652                      IE = 1
2653                      ITAUQ = ITAU
2654                      ITAUP = ITAUQ + M
2655                      IWORK = ITAUP + M
2656 *
2657 *                    Bidiagonalize L in WORK(IU), copying result to
2658 *                    WORK(IR)
2659 *                    (CWorkspace: need   2*M*M+3*M,
2660 *                                 prefer 2*M*M+2*M+2*M*NB)
2661 *                    (RWorkspace: need   M)
2662 *
2663                      CALL ZGEBRD( M, M, WORK( IU ), LDWRKU, S,
2664      $                            RWORK( IE ), WORK( ITAUQ ),
2665      $                            WORK( ITAUP ), WORK( IWORK ),
2666      $                            LWORK-IWORK+1, IERR )
2667                      CALL ZLACPY( 'L', M, M, WORK( IU ), LDWRKU,
2668      $                            WORK( IR ), LDWRKR )
2669 *
2670 *                    Generate right bidiagonalizing vectors in WORK(IU)
2671 *                    (CWorkspace: need   2*M*M+3*M-1,
2672 *                                 prefer 2*M*M+2*M+(M-1)*NB)
2673 *                    (RWorkspace: 0)
2674 *
2675                      CALL ZUNGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
2676      $                            WORK( ITAUP ), WORK( IWORK ),
2677      $                            LWORK-IWORK+1, IERR )
2678 *
2679 *                    Generate left bidiagonalizing vectors in WORK(IR)
2680 *                    (CWorkspace: need 2*M*M+3*M, prefer 2*M*M+2*M+M*NB)
2681 *                    (RWorkspace: 0)
2682 *
2683                      CALL ZUNGBR( 'Q', M, M, M, WORK( IR ), LDWRKR,
2684      $                            WORK( ITAUQ ), WORK( IWORK ),
2685      $                            LWORK-IWORK+1, IERR )
2686                      IRWORK = IE + M
2687 *
2688 *                    Perform bidiagonal QR iteration, computing left
2689 *                    singular vectors of L in WORK(IR) and computing
2690 *                    right singular vectors of L in WORK(IU)
2691 *                    (CWorkspace: need 2*M*M)
2692 *                    (RWorkspace: need BDSPAC)
2693 *
2694                      CALL ZBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
2695      $                            WORK( IU ), LDWRKU, WORK( IR ),
2696      $                            LDWRKR, CDUM, 1, RWORK( IRWORK ),
2697      $                            INFO )
2698 *
2699 *                    Multiply right singular vectors of L in WORK(IU) by
2700 *                    Q in A, storing result in VT
2701 *                    (CWorkspace: need M*M)
2702 *                    (RWorkspace: 0)
2703 *
2704                      CALL ZGEMM( 'N''N', M, N, M, CONE, WORK( IU ),
2705      $                           LDWRKU, A, LDA, CZERO, VT, LDVT )
2706 *
2707 *                    Copy left singular vectors of L to A
2708 *                    (CWorkspace: need M*M)
2709 *                    (RWorkspace: 0)
2710 *
2711                      CALL ZLACPY( 'F', M, M, WORK( IR ), LDWRKR, A,
2712      $                            LDA )
2713 *
2714                   ELSE
2715 *
2716 *                    Insufficient workspace for a fast algorithm
2717 *
2718                      ITAU = 1
2719                      IWORK = ITAU + M
2720 *
2721 *                    Compute A=L*Q, copying result to VT
2722 *                    (CWorkspace: need 2*M, prefer M+M*NB)
2723 *                    (RWorkspace: 0)
2724 *
2725                      CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
2726      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2727                      CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
2728 *
2729 *                    Generate Q in VT
2730 *                    (CWorkspace: need 2*M, prefer M+M*NB)
2731 *                    (RWorkspace: 0)
2732 *
2733                      CALL ZUNGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
2734      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2735                      IE = 1
2736                      ITAUQ = ITAU
2737                      ITAUP = ITAUQ + M
2738                      IWORK = ITAUP + M
2739 *
2740 *                    Zero out above L in A
2741 *
2742                      CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
2743      $                            A( 12 ), LDA )
2744 *
2745 *                    Bidiagonalize L in A
2746 *                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
2747 *                    (RWorkspace: need M)
2748 *
2749                      CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ),
2750      $                            WORK( ITAUQ ), WORK( ITAUP ),
2751      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2752 *
2753 *                    Multiply right vectors bidiagonalizing L by Q in VT
2754 *                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
2755 *                    (RWorkspace: 0)
2756 *
2757                      CALL ZUNMBR( 'P''L''C', M, N, M, A, LDA,
2758      $                            WORK( ITAUP ), VT, LDVT,
2759      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2760 *
2761 *                    Generate left bidiagonalizing vectors of L in A
2762 *                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
2763 *                    (RWorkspace: 0)
2764 *
2765                      CALL ZUNGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
2766      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2767                      IRWORK = IE + M
2768 *
2769 *                    Perform bidiagonal QR iteration, computing left
2770 *                    singular vectors of A in A and computing right
2771 *                    singular vectors of A in VT
2772 *                    (CWorkspace: 0)
2773 *                    (RWorkspace: need BDSPAC)
2774 *
2775                      CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
2776      $                            LDVT, A, LDA, CDUM, 1,
2777      $                            RWORK( IRWORK ), INFO )
2778 *
2779                   END IF
2780 *
2781                ELSE IF( WNTUAS ) THEN
2782 *
2783 *                 Path 6t(N much larger than M, JOBU='S' or 'A',
2784 *                         JOBVT='S')
2785 *                 M right singular vectors to be computed in VT and
2786 *                 M left singular vectors to be computed in U
2787 *
2788                   IF( LWORK.GE.M*M+3*M ) THEN
2789 *
2790 *                    Sufficient workspace for a fast algorithm
2791 *
2792                      IU = 1
2793                      IF( LWORK.GE.WRKBL+LDA*M ) THEN
2794 *
2795 *                       WORK(IU) is LDA by N
2796 *
2797                         LDWRKU = LDA
2798                      ELSE
2799 *
2800 *                       WORK(IU) is LDA by M
2801 *
2802                         LDWRKU = M
2803                      END IF
2804                      ITAU = IU + LDWRKU*M
2805                      IWORK = ITAU + M
2806 *
2807 *                    Compute A=L*Q
2808 *                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
2809 *                    (RWorkspace: 0)
2810 *
2811                      CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
2812      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2813 *
2814 *                    Copy L to WORK(IU), zeroing out above it
2815 *
2816                      CALL ZLACPY( 'L', M, M, A, LDA, WORK( IU ),
2817      $                            LDWRKU )
2818                      CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
2819      $                            WORK( IU+LDWRKU ), LDWRKU )
2820 *
2821 *                    Generate Q in A
2822 *                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
2823 *                    (RWorkspace: 0)
2824 *
2825                      CALL ZUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
2826      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2827                      IE = 1
2828                      ITAUQ = ITAU
2829                      ITAUP = ITAUQ + M
2830                      IWORK = ITAUP + M
2831 *
2832 *                    Bidiagonalize L in WORK(IU), copying result to U
2833 *                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
2834 *                    (RWorkspace: need M)
2835 *
2836                      CALL ZGEBRD( M, M, WORK( IU ), LDWRKU, S,
2837      $                            RWORK( IE ), WORK( ITAUQ ),
2838      $                            WORK( ITAUP ), WORK( IWORK ),
2839      $                            LWORK-IWORK+1, IERR )
2840                      CALL ZLACPY( 'L', M, M, WORK( IU ), LDWRKU, U,
2841      $                            LDU )
2842 *
2843 *                    Generate right bidiagonalizing vectors in WORK(IU)
2844 *                    (CWorkspace: need   M*M+3*M-1,
2845 *                                 prefer M*M+2*M+(M-1)*NB)
2846 *                    (RWorkspace: 0)
2847 *
2848                      CALL ZUNGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
2849      $                            WORK( ITAUP ), WORK( IWORK ),
2850      $                            LWORK-IWORK+1, IERR )
2851 *
2852 *                    Generate left bidiagonalizing vectors in U
2853 *                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
2854 *                    (RWorkspace: 0)
2855 *
2856                      CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
2857      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2858                      IRWORK = IE + M
2859 *
2860 *                    Perform bidiagonal QR iteration, computing left
2861 *                    singular vectors of L in U and computing right
2862 *                    singular vectors of L in WORK(IU)
2863 *                    (CWorkspace: need M*M)
2864 *                    (RWorkspace: need BDSPAC)
2865 *
2866                      CALL ZBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
2867      $                            WORK( IU ), LDWRKU, U, LDU, CDUM, 1,
2868      $                            RWORK( IRWORK ), INFO )
2869 *
2870 *                    Multiply right singular vectors of L in WORK(IU) by
2871 *                    Q in A, storing result in VT
2872 *                    (CWorkspace: need M*M)
2873 *                    (RWorkspace: 0)
2874 *
2875                      CALL ZGEMM( 'N''N', M, N, M, CONE, WORK( IU ),
2876      $                           LDWRKU, A, LDA, CZERO, VT, LDVT )
2877 *
2878                   ELSE
2879 *
2880 *                    Insufficient workspace for a fast algorithm
2881 *
2882                      ITAU = 1
2883                      IWORK = ITAU + M
2884 *
2885 *                    Compute A=L*Q, copying result to VT
2886 *                    (CWorkspace: need 2*M, prefer M+M*NB)
2887 *                    (RWorkspace: 0)
2888 *
2889                      CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
2890      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2891                      CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
2892 *
2893 *                    Generate Q in VT
2894 *                    (CWorkspace: need 2*M, prefer M+M*NB)
2895 *                    (RWorkspace: 0)
2896 *
2897                      CALL ZUNGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
2898      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2899 *
2900 *                    Copy L to U, zeroing out above it
2901 *
2902                      CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
2903                      CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
2904      $                            U( 12 ), LDU )
2905                      IE = 1
2906                      ITAUQ = ITAU
2907                      ITAUP = ITAUQ + M
2908                      IWORK = ITAUP + M
2909 *
2910 *                    Bidiagonalize L in U
2911 *                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
2912 *                    (RWorkspace: need M)
2913 *
2914                      CALL ZGEBRD( M, M, U, LDU, S, RWORK( IE ),
2915      $                            WORK( ITAUQ ), WORK( ITAUP ),
2916      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2917 *
2918 *                    Multiply right bidiagonalizing vectors in U by Q
2919 *                    in VT
2920 *                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
2921 *                    (RWorkspace: 0)
2922 *
2923                      CALL ZUNMBR( 'P''L''C', M, N, M, U, LDU,
2924      $                            WORK( ITAUP ), VT, LDVT,
2925      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2926 *
2927 *                    Generate left bidiagonalizing vectors in U
2928 *                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
2929 *                    (RWorkspace: 0)
2930 *
2931                      CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
2932      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2933                      IRWORK = IE + M
2934 *
2935 *                    Perform bidiagonal QR iteration, computing left
2936 *                    singular vectors of A in U and computing right
2937 *                    singular vectors of A in VT
2938 *                    (CWorkspace: 0)
2939 *                    (RWorkspace: need BDSPAC)
2940 *
2941                      CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
2942      $                            LDVT, U, LDU, CDUM, 1,
2943      $                            RWORK( IRWORK ), INFO )
2944 *
2945                   END IF
2946 *
2947                END IF
2948 *
2949             ELSE IF( WNTVA ) THEN
2950 *
2951                IF( WNTUN ) THEN
2952 *
2953 *                 Path 7t(N much larger than M, JOBU='N', JOBVT='A')
2954 *                 N right singular vectors to be computed in VT and
2955 *                 no left singular vectors to be computed
2956 *
2957                   IF( LWORK.GE.M*M+MAX( N+M, 3*M ) ) THEN
2958 *
2959 *                    Sufficient workspace for a fast algorithm
2960 *
2961                      IR = 1
2962                      IF( LWORK.GE.WRKBL+LDA*M ) THEN
2963 *
2964 *                       WORK(IR) is LDA by M
2965 *
2966                         LDWRKR = LDA
2967                      ELSE
2968 *
2969 *                       WORK(IR) is M by M
2970 *
2971                         LDWRKR = M
2972                      END IF
2973                      ITAU = IR + LDWRKR*M
2974                      IWORK = ITAU + M
2975 *
2976 *                    Compute A=L*Q, copying result to VT
2977 *                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
2978 *                    (RWorkspace: 0)
2979 *
2980                      CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
2981      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2982                      CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
2983 *
2984 *                    Copy L to WORK(IR), zeroing out above it
2985 *
2986                      CALL ZLACPY( 'L', M, M, A, LDA, WORK( IR ),
2987      $                            LDWRKR )
2988                      CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
2989      $                            WORK( IR+LDWRKR ), LDWRKR )
2990 *
2991 *                    Generate Q in VT
2992 *                    (CWorkspace: need M*M+M+N, prefer M*M+M+N*NB)
2993 *                    (RWorkspace: 0)
2994 *
2995                      CALL ZUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
2996      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
2997                      IE = 1
2998                      ITAUQ = ITAU
2999                      ITAUP = ITAUQ + M
3000                      IWORK = ITAUP + M
3001 *
3002 *                    Bidiagonalize L in WORK(IR)
3003 *                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
3004 *                    (RWorkspace: need M)
3005 *
3006                      CALL ZGEBRD( M, M, WORK( IR ), LDWRKR, S,
3007      $                            RWORK( IE ), WORK( ITAUQ ),
3008      $                            WORK( ITAUP ), WORK( IWORK ),
3009      $                            LWORK-IWORK+1, IERR )
3010 *
3011 *                    Generate right bidiagonalizing vectors in WORK(IR)
3012 *                    (CWorkspace: need   M*M+3*M-1,
3013 *                                 prefer M*M+2*M+(M-1)*NB)
3014 *                    (RWorkspace: 0)
3015 *
3016                      CALL ZUNGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
3017      $                            WORK( ITAUP ), WORK( IWORK ),
3018      $                            LWORK-IWORK+1, IERR )
3019                      IRWORK = IE + M
3020 *
3021 *                    Perform bidiagonal QR iteration, computing right
3022 *                    singular vectors of L in WORK(IR)
3023 *                    (CWorkspace: need M*M)
3024 *                    (RWorkspace: need BDSPAC)
3025 *
3026                      CALL ZBDSQR( 'U', M, M, 00, S, RWORK( IE ),
3027      $                            WORK( IR ), LDWRKR, CDUM, 1, CDUM, 1,
3028      $                            RWORK( IRWORK ), INFO )
3029 *
3030 *                    Multiply right singular vectors of L in WORK(IR) by
3031 *                    Q in VT, storing result in A
3032 *                    (CWorkspace: need M*M)
3033 *                    (RWorkspace: 0)
3034 *
3035                      CALL ZGEMM( 'N''N', M, N, M, CONE, WORK( IR ),
3036      $                           LDWRKR, VT, LDVT, CZERO, A, LDA )
3037 *
3038 *                    Copy right singular vectors of A from A to VT
3039 *
3040                      CALL ZLACPY( 'F', M, N, A, LDA, VT, LDVT )
3041 *
3042                   ELSE
3043 *
3044 *                    Insufficient workspace for a fast algorithm
3045 *
3046                      ITAU = 1
3047                      IWORK = ITAU + M
3048 *
3049 *                    Compute A=L*Q, copying result to VT
3050 *                    (CWorkspace: need 2*M, prefer M+M*NB)
3051 *                    (RWorkspace: 0)
3052 *
3053                      CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
3054      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3055                      CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
3056 *
3057 *                    Generate Q in VT
3058 *                    (CWorkspace: need M+N, prefer M+N*NB)
3059 *                    (RWorkspace: 0)
3060 *
3061                      CALL ZUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3062      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3063                      IE = 1
3064                      ITAUQ = ITAU
3065                      ITAUP = ITAUQ + M
3066                      IWORK = ITAUP + M
3067 *
3068 *                    Zero out above L in A
3069 *
3070                      CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
3071      $                            A( 12 ), LDA )
3072 *
3073 *                    Bidiagonalize L in A
3074 *                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
3075 *                    (RWorkspace: need M)
3076 *
3077                      CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ),
3078      $                            WORK( ITAUQ ), WORK( ITAUP ),
3079      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3080 *
3081 *                    Multiply right bidiagonalizing vectors in A by Q
3082 *                    in VT
3083 *                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
3084 *                    (RWorkspace: 0)
3085 *
3086                      CALL ZUNMBR( 'P''L''C', M, N, M, A, LDA,
3087      $                            WORK( ITAUP ), VT, LDVT,
3088      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3089                      IRWORK = IE + M
3090 *
3091 *                    Perform bidiagonal QR iteration, computing right
3092 *                    singular vectors of A in VT
3093 *                    (CWorkspace: 0)
3094 *                    (RWorkspace: need BDSPAC)
3095 *
3096                      CALL ZBDSQR( 'U', M, N, 00, S, RWORK( IE ), VT,
3097      $                            LDVT, CDUM, 1, CDUM, 1,
3098      $                            RWORK( IRWORK ), INFO )
3099 *
3100                   END IF
3101 *
3102                ELSE IF( WNTUO ) THEN
3103 *
3104 *                 Path 8t(N much larger than M, JOBU='O', JOBVT='A')
3105 *                 N right singular vectors to be computed in VT and
3106 *                 M left singular vectors to be overwritten on A
3107 *
3108                   IF( LWORK.GE.2*M*M+MAX( N+M, 3*M ) ) THEN
3109 *
3110 *                    Sufficient workspace for a fast algorithm
3111 *
3112                      IU = 1
3113                      IF( LWORK.GE.WRKBL+2*LDA*M ) THEN
3114 *
3115 *                       WORK(IU) is LDA by M and WORK(IR) is LDA by M
3116 *
3117                         LDWRKU = LDA
3118                         IR = IU + LDWRKU*M
3119                         LDWRKR = LDA
3120                      ELSE IF( LWORK.GE.WRKBL+( LDA+M )*M ) THEN
3121 *
3122 *                       WORK(IU) is LDA by M and WORK(IR) is M by M
3123 *
3124                         LDWRKU = LDA
3125                         IR = IU + LDWRKU*M
3126                         LDWRKR = M
3127                      ELSE
3128 *
3129 *                       WORK(IU) is M by M and WORK(IR) is M by M
3130 *
3131                         LDWRKU = M
3132                         IR = IU + LDWRKU*M
3133                         LDWRKR = M
3134                      END IF
3135                      ITAU = IR + LDWRKR*M
3136                      IWORK = ITAU + M
3137 *
3138 *                    Compute A=L*Q, copying result to VT
3139 *                    (CWorkspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
3140 *                    (RWorkspace: 0)
3141 *
3142                      CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
3143      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3144                      CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
3145 *
3146 *                    Generate Q in VT
3147 *                    (CWorkspace: need 2*M*M+M+N, prefer 2*M*M+M+N*NB)
3148 *                    (RWorkspace: 0)
3149 *
3150                      CALL ZUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3151      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3152 *
3153 *                    Copy L to WORK(IU), zeroing out above it
3154 *
3155                      CALL ZLACPY( 'L', M, M, A, LDA, WORK( IU ),
3156      $                            LDWRKU )
3157                      CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
3158      $                            WORK( IU+LDWRKU ), LDWRKU )
3159                      IE = 1
3160                      ITAUQ = ITAU
3161                      ITAUP = ITAUQ + M
3162                      IWORK = ITAUP + M
3163 *
3164 *                    Bidiagonalize L in WORK(IU), copying result to
3165 *                    WORK(IR)
3166 *                    (CWorkspace: need   2*M*M+3*M,
3167 *                                 prefer 2*M*M+2*M+2*M*NB)
3168 *                    (RWorkspace: need   M)
3169 *
3170                      CALL ZGEBRD( M, M, WORK( IU ), LDWRKU, S,
3171      $                            RWORK( IE ), WORK( ITAUQ ),
3172      $                            WORK( ITAUP ), WORK( IWORK ),
3173      $                            LWORK-IWORK+1, IERR )
3174                      CALL ZLACPY( 'L', M, M, WORK( IU ), LDWRKU,
3175      $                            WORK( IR ), LDWRKR )
3176 *
3177 *                    Generate right bidiagonalizing vectors in WORK(IU)
3178 *                    (CWorkspace: need   2*M*M+3*M-1,
3179 *                                 prefer 2*M*M+2*M+(M-1)*NB)
3180 *                    (RWorkspace: 0)
3181 *
3182                      CALL ZUNGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
3183      $                            WORK( ITAUP ), WORK( IWORK ),
3184      $                            LWORK-IWORK+1, IERR )
3185 *
3186 *                    Generate left bidiagonalizing vectors in WORK(IR)
3187 *                    (CWorkspace: need 2*M*M+3*M, prefer 2*M*M+2*M+M*NB)
3188 *                    (RWorkspace: 0)
3189 *
3190                      CALL ZUNGBR( 'Q', M, M, M, WORK( IR ), LDWRKR,
3191      $                            WORK( ITAUQ ), WORK( IWORK ),
3192      $                            LWORK-IWORK+1, IERR )
3193                      IRWORK = IE + M
3194 *
3195 *                    Perform bidiagonal QR iteration, computing left
3196 *                    singular vectors of L in WORK(IR) and computing
3197 *                    right singular vectors of L in WORK(IU)
3198 *                    (CWorkspace: need 2*M*M)
3199 *                    (RWorkspace: need BDSPAC)
3200 *
3201                      CALL ZBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
3202      $                            WORK( IU ), LDWRKU, WORK( IR ),
3203      $                            LDWRKR, CDUM, 1, RWORK( IRWORK ),
3204      $                            INFO )
3205 *
3206 *                    Multiply right singular vectors of L in WORK(IU) by
3207 *                    Q in VT, storing result in A
3208 *                    (CWorkspace: need M*M)
3209 *                    (RWorkspace: 0)
3210 *
3211                      CALL ZGEMM( 'N''N', M, N, M, CONE, WORK( IU ),
3212      $                           LDWRKU, VT, LDVT, CZERO, A, LDA )
3213 *
3214 *                    Copy right singular vectors of A from A to VT
3215 *
3216                      CALL ZLACPY( 'F', M, N, A, LDA, VT, LDVT )
3217 *
3218 *                    Copy left singular vectors of A from WORK(IR) to A
3219 *
3220                      CALL ZLACPY( 'F', M, M, WORK( IR ), LDWRKR, A,
3221      $                            LDA )
3222 *
3223                   ELSE
3224 *
3225 *                    Insufficient workspace for a fast algorithm
3226 *
3227                      ITAU = 1
3228                      IWORK = ITAU + M
3229 *
3230 *                    Compute A=L*Q, copying result to VT
3231 *                    (CWorkspace: need 2*M, prefer M+M*NB)
3232 *                    (RWorkspace: 0)
3233 *
3234                      CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
3235      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3236                      CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
3237 *
3238 *                    Generate Q in VT
3239 *                    (CWorkspace: need M+N, prefer M+N*NB)
3240 *                    (RWorkspace: 0)
3241 *
3242                      CALL ZUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3243      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3244                      IE = 1
3245                      ITAUQ = ITAU
3246                      ITAUP = ITAUQ + M
3247                      IWORK = ITAUP + M
3248 *
3249 *                    Zero out above L in A
3250 *
3251                      CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
3252      $                            A( 12 ), LDA )
3253 *
3254 *                    Bidiagonalize L in A
3255 *                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
3256 *                    (RWorkspace: need M)
3257 *
3258                      CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ),
3259      $                            WORK( ITAUQ ), WORK( ITAUP ),
3260      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3261 *
3262 *                    Multiply right bidiagonalizing vectors in A by Q
3263 *                    in VT
3264 *                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
3265 *                    (RWorkspace: 0)
3266 *
3267                      CALL ZUNMBR( 'P''L''C', M, N, M, A, LDA,
3268      $                            WORK( ITAUP ), VT, LDVT,
3269      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3270 *
3271 *                    Generate left bidiagonalizing vectors in A
3272 *                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
3273 *                    (RWorkspace: 0)
3274 *
3275                      CALL ZUNGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
3276      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3277                      IRWORK = IE + M
3278 *
3279 *                    Perform bidiagonal QR iteration, computing left
3280 *                    singular vectors of A in A and computing right
3281 *                    singular vectors of A in VT
3282 *                    (CWorkspace: 0)
3283 *                    (RWorkspace: need BDSPAC)
3284 *
3285                      CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
3286      $                            LDVT, A, LDA, CDUM, 1,
3287      $                            RWORK( IRWORK ), INFO )
3288 *
3289                   END IF
3290 *
3291                ELSE IF( WNTUAS ) THEN
3292 *
3293 *                 Path 9t(N much larger than M, JOBU='S' or 'A',
3294 *                         JOBVT='A')
3295 *                 N right singular vectors to be computed in VT and
3296 *                 M left singular vectors to be computed in U
3297 *
3298                   IF( LWORK.GE.M*M+MAX( N+M, 3*M ) ) THEN
3299 *
3300 *                    Sufficient workspace for a fast algorithm
3301 *
3302                      IU = 1
3303                      IF( LWORK.GE.WRKBL+LDA*M ) THEN
3304 *
3305 *                       WORK(IU) is LDA by M
3306 *
3307                         LDWRKU = LDA
3308                      ELSE
3309 *
3310 *                       WORK(IU) is M by M
3311 *
3312                         LDWRKU = M
3313                      END IF
3314                      ITAU = IU + LDWRKU*M
3315                      IWORK = ITAU + M
3316 *
3317 *                    Compute A=L*Q, copying result to VT
3318 *                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
3319 *                    (RWorkspace: 0)
3320 *
3321                      CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
3322      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3323                      CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
3324 *
3325 *                    Generate Q in VT
3326 *                    (CWorkspace: need M*M+M+N, prefer M*M+M+N*NB)
3327 *                    (RWorkspace: 0)
3328 *
3329                      CALL ZUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3330      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3331 *
3332 *                    Copy L to WORK(IU), zeroing out above it
3333 *
3334                      CALL ZLACPY( 'L', M, M, A, LDA, WORK( IU ),
3335      $                            LDWRKU )
3336                      CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
3337      $                            WORK( IU+LDWRKU ), LDWRKU )
3338                      IE = 1
3339                      ITAUQ = ITAU
3340                      ITAUP = ITAUQ + M
3341                      IWORK = ITAUP + M
3342 *
3343 *                    Bidiagonalize L in WORK(IU), copying result to U
3344 *                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
3345 *                    (RWorkspace: need M)
3346 *
3347                      CALL ZGEBRD( M, M, WORK( IU ), LDWRKU, S,
3348      $                            RWORK( IE ), WORK( ITAUQ ),
3349      $                            WORK( ITAUP ), WORK( IWORK ),
3350      $                            LWORK-IWORK+1, IERR )
3351                      CALL ZLACPY( 'L', M, M, WORK( IU ), LDWRKU, U,
3352      $                            LDU )
3353 *
3354 *                    Generate right bidiagonalizing vectors in WORK(IU)
3355 *                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+(M-1)*NB)
3356 *                    (RWorkspace: 0)
3357 *
3358                      CALL ZUNGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
3359      $                            WORK( ITAUP ), WORK( IWORK ),
3360      $                            LWORK-IWORK+1, IERR )
3361 *
3362 *                    Generate left bidiagonalizing vectors in U
3363 *                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
3364 *                    (RWorkspace: 0)
3365 *
3366                      CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
3367      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3368                      IRWORK = IE + M
3369 *
3370 *                    Perform bidiagonal QR iteration, computing left
3371 *                    singular vectors of L in U and computing right
3372 *                    singular vectors of L in WORK(IU)
3373 *                    (CWorkspace: need M*M)
3374 *                    (RWorkspace: need BDSPAC)
3375 *
3376                      CALL ZBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
3377      $                            WORK( IU ), LDWRKU, U, LDU, CDUM, 1,
3378      $                            RWORK( IRWORK ), INFO )
3379 *
3380 *                    Multiply right singular vectors of L in WORK(IU) by
3381 *                    Q in VT, storing result in A
3382 *                    (CWorkspace: need M*M)
3383 *                    (RWorkspace: 0)
3384 *
3385                      CALL ZGEMM( 'N''N', M, N, M, CONE, WORK( IU ),
3386      $                           LDWRKU, VT, LDVT, CZERO, A, LDA )
3387 *
3388 *                    Copy right singular vectors of A from A to VT
3389 *
3390                      CALL ZLACPY( 'F', M, N, A, LDA, VT, LDVT )
3391 *
3392                   ELSE
3393 *
3394 *                    Insufficient workspace for a fast algorithm
3395 *
3396                      ITAU = 1
3397                      IWORK = ITAU + M
3398 *
3399 *                    Compute A=L*Q, copying result to VT
3400 *                    (CWorkspace: need 2*M, prefer M+M*NB)
3401 *                    (RWorkspace: 0)
3402 *
3403                      CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
3404      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3405                      CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
3406 *
3407 *                    Generate Q in VT
3408 *                    (CWorkspace: need M+N, prefer M+N*NB)
3409 *                    (RWorkspace: 0)
3410 *
3411                      CALL ZUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3412      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3413 *
3414 *                    Copy L to U, zeroing out above it
3415 *
3416                      CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
3417                      CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
3418      $                            U( 12 ), LDU )
3419                      IE = 1
3420                      ITAUQ = ITAU
3421                      ITAUP = ITAUQ + M
3422                      IWORK = ITAUP + M
3423 *
3424 *                    Bidiagonalize L in U
3425 *                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
3426 *                    (RWorkspace: need M)
3427 *
3428                      CALL ZGEBRD( M, M, U, LDU, S, RWORK( IE ),
3429      $                            WORK( ITAUQ ), WORK( ITAUP ),
3430      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3431 *
3432 *                    Multiply right bidiagonalizing vectors in U by Q
3433 *                    in VT
3434 *                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
3435 *                    (RWorkspace: 0)
3436 *
3437                      CALL ZUNMBR( 'P''L''C', M, N, M, U, LDU,
3438      $                            WORK( ITAUP ), VT, LDVT,
3439      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3440 *
3441 *                    Generate left bidiagonalizing vectors in U
3442 *                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
3443 *                    (RWorkspace: 0)
3444 *
3445                      CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
3446      $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
3447                      IRWORK = IE + M
3448 *
3449 *                    Perform bidiagonal QR iteration, computing left
3450 *                    singular vectors of A in U and computing right
3451 *                    singular vectors of A in VT
3452 *                    (CWorkspace: 0)
3453 *                    (RWorkspace: need BDSPAC)
3454 *
3455                      CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
3456      $                            LDVT, U, LDU, CDUM, 1,
3457      $                            RWORK( IRWORK ), INFO )
3458 *
3459                   END IF
3460 *
3461                END IF
3462 *
3463             END IF
3464 *
3465          ELSE
3466 *
3467 *           N .LT. MNTHR
3468 *
3469 *           Path 10t(N greater than M, but not much larger)
3470 *           Reduce to bidiagonal form without LQ decomposition
3471 *
3472             IE = 1
3473             ITAUQ = 1
3474             ITAUP = ITAUQ + M
3475             IWORK = ITAUP + M
3476 *
3477 *           Bidiagonalize A
3478 *           (CWorkspace: need 2*M+N, prefer 2*M+(M+N)*NB)
3479 *           (RWorkspace: M)
3480 *
3481             CALL ZGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
3482      $                   WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
3483      $                   IERR )
3484             IF( WNTUAS ) THEN
3485 *
3486 *              If left singular vectors desired in U, copy result to U
3487 *              and generate left bidiagonalizing vectors in U
3488 *              (CWorkspace: need 3*M-1, prefer 2*M+(M-1)*NB)
3489 *              (RWorkspace: 0)
3490 *
3491                CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
3492                CALL ZUNGBR( 'Q', M, M, N, U, LDU, WORK( ITAUQ ),
3493      $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
3494             END IF
3495             IF( WNTVAS ) THEN
3496 *
3497 *              If right singular vectors desired in VT, copy result to
3498 *              VT and generate right bidiagonalizing vectors in VT
3499 *              (CWorkspace: need 2*M+NRVT, prefer 2*M+NRVT*NB)
3500 *              (RWorkspace: 0)
3501 *
3502                CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
3503                IF( WNTVA )
3504      $            NRVT = N
3505                IF( WNTVS )
3506      $            NRVT = M
3507                CALL ZUNGBR( 'P', NRVT, N, M, VT, LDVT, WORK( ITAUP ),
3508      $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
3509             END IF
3510             IF( WNTUO ) THEN
3511 *
3512 *              If left singular vectors desired in A, generate left
3513 *              bidiagonalizing vectors in A
3514 *              (CWorkspace: need 3*M-1, prefer 2*M+(M-1)*NB)
3515 *              (RWorkspace: 0)
3516 *
3517                CALL ZUNGBR( 'Q', M, M, N, A, LDA, WORK( ITAUQ ),
3518      $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
3519             END IF
3520             IF( WNTVO ) THEN
3521 *
3522 *              If right singular vectors desired in A, generate right
3523 *              bidiagonalizing vectors in A
3524 *              (CWorkspace: need 3*M, prefer 2*M+M*NB)
3525 *              (RWorkspace: 0)
3526 *
3527                CALL ZUNGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
3528      $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
3529             END IF
3530             IRWORK = IE + M
3531             IF( WNTUAS .OR. WNTUO )
3532      $         NRU = M
3533             IF( WNTUN )
3534      $         NRU = 0
3535             IF( WNTVAS .OR. WNTVO )
3536      $         NCVT = N
3537             IF( WNTVN )
3538      $         NCVT = 0
3539             IF( ( .NOT.WNTUO ) .AND. ( .NOT.WNTVO ) ) THEN
3540 *
3541 *              Perform bidiagonal QR iteration, if desired, computing
3542 *              left singular vectors in U and computing right singular
3543 *              vectors in VT
3544 *              (CWorkspace: 0)
3545 *              (RWorkspace: need BDSPAC)
3546 *
3547                CALL ZBDSQR( 'L', M, NCVT, NRU, 0, S, RWORK( IE ), VT,
3548      $                      LDVT, U, LDU, CDUM, 1, RWORK( IRWORK ),
3549      $                      INFO )
3550             ELSE IF( ( .NOT.WNTUO ) .AND. WNTVO ) THEN
3551 *
3552 *              Perform bidiagonal QR iteration, if desired, computing
3553 *              left singular vectors in U and computing right singular
3554 *              vectors in A
3555 *              (CWorkspace: 0)
3556 *              (RWorkspace: need BDSPAC)
3557 *
3558                CALL ZBDSQR( 'L', M, NCVT, NRU, 0, S, RWORK( IE ), A,
3559      $                      LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
3560      $                      INFO )
3561             ELSE
3562 *
3563 *              Perform bidiagonal QR iteration, if desired, computing
3564 *              left singular vectors in A and computing right singular
3565 *              vectors in VT
3566 *              (CWorkspace: 0)
3567 *              (RWorkspace: need BDSPAC)
3568 *
3569                CALL ZBDSQR( 'L', M, NCVT, NRU, 0, S, RWORK( IE ), VT,
3570      $                      LDVT, A, LDA, CDUM, 1, RWORK( IRWORK ),
3571      $                      INFO )
3572             END IF
3573 *
3574          END IF
3575 *
3576       END IF
3577 *
3578 *     Undo scaling if necessary
3579 *
3580       IF( ISCL.EQ.1 ) THEN
3581          IF( ANRM.GT.BIGNUM )
3582      $      CALL DLASCL( 'G'00, BIGNUM, ANRM, MINMN, 1, S, MINMN,
3583      $                   IERR )
3584          IF( INFO.NE.0 .AND. ANRM.GT.BIGNUM )
3585      $      CALL DLASCL( 'G'00, BIGNUM, ANRM, MINMN-11,
3586      $                   RWORK( IE ), MINMN, IERR )
3587          IF( ANRM.LT.SMLNUM )
3588      $      CALL DLASCL( 'G'00, SMLNUM, ANRM, MINMN, 1, S, MINMN,
3589      $                   IERR )
3590          IF( INFO.NE.0 .AND. ANRM.LT.SMLNUM )
3591      $      CALL DLASCL( 'G'00, SMLNUM, ANRM, MINMN-11,
3592      $                   RWORK( IE ), MINMN, IERR )
3593       END IF
3594 *
3595 *     Return optimal workspace in WORK(1)
3596 *
3597       WORK( 1 ) = MAXWRK
3598 *
3599       RETURN
3600 *
3601 *     End of ZGESVD
3602 *
3603       END