Annotation of rpl/lapack/lapack/zgesvd.f, revision 1.4

1.1       bertrand    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.0D0, 0.0D0 ),
                    142:      $                   CONE = ( 1.0D0, 0.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          MAX, MIN, SQRT
                    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.MAX( 1, 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.N .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, 0, 0 )
                    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*N + 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*N + 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*N + WRKBL
                    279:                   MINWRK = 2*N + 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*N + WRKBL
                    294:                   MINWRK = 2*N + 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*N + WRKBL
                    310:                   MINWRK = 2*N + 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*N + WRKBL
                    323:                   MINWRK = 2*N + 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*N + WRKBL
                    338:                   MINWRK = 2*N + 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*N + WRKBL
                    354:                   MINWRK = 2*N + M
                    355:                END IF
                    356:             ELSE
                    357: *
                    358: *              Path 10 (M at least N, but not much larger)
                    359: *
                    360:                MAXWRK = 2*N + ( 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*N + 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, 0, 0 )
                    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*M + 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*M + 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*M + WRKBL
                    432:                   MINWRK = 2*M + 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*M + WRKBL
                    447:                   MINWRK = 2*M + 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*M + WRKBL
                    463:                   MINWRK = 2*M + 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*M + WRKBL
                    476:                   MINWRK = 2*M + 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*M + WRKBL
                    491:                   MINWRK = 2*M + 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*M + WRKBL
                    507:                   MINWRK = 2*M + N
                    508:                END IF
                    509:             ELSE
                    510: *
                    511: *              Path 10t(N greater than M, but not much larger)
                    512: *
                    513:                MAXWRK = 2*M + ( 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*M + 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', 0, 0, ANRM, SMLNUM, M, N, A, LDA, IERR )
                    561:       ELSE IF( ANRM.GT.BIGNUM ) THEN
                    562:          ISCL = 1
                    563:          CALL ZLASCL( 'G', 0, 0, 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( 2, 1 ),
                    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, 0, 0, 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( 2, 1 ), 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( 2, 1 ), 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( 2, 1 ), 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( 2, 1 ), 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( 2, 1 ), 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( 2, 1 ), 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( 2, 1 ), 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( 2, 1 ), 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( 1, 2 ),
                   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, 0, 0, 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, 0, 0, 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( 1, 2 ),
                   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( 1, 2 ),
                   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, 0, 0, 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( 1, 2 ), 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, 0, 0, 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( 1, 2 ), 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( 1, 2 ), 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, 0, 0, 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( 1, 2 ), 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, 0, 0, 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( 1, 2 ), 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( 1, 2 ), 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', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
                   3583:      $                   IERR )
                   3584:          IF( INFO.NE.0 .AND. ANRM.GT.BIGNUM )
                   3585:      $      CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN-1, 1,
                   3586:      $                   RWORK( IE ), MINMN, IERR )
                   3587:          IF( ANRM.LT.SMLNUM )
                   3588:      $      CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
                   3589:      $                   IERR )
                   3590:          IF( INFO.NE.0 .AND. ANRM.LT.SMLNUM )
                   3591:      $      CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN-1, 1,
                   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

CVSweb interface <joel.bertrand@systella.fr>