DBDSDC - compute the singular value decomposition (SVD) of
       a real N-by-N (upper or lower) bidiagonal matrix B


SYNOPSIS

       SUBROUTINE DBDSDC( UPLO, COMPQ, N, D, E, U, LDU, VT, LDVT,
                          Q, IQ, WORK, IWORK, INFO )

           CHARACTER      COMPQ, UPLO

           INTEGER        INFO, LDU, LDVT, N

           INTEGER        IQ( * ), IWORK( * )

           DOUBLE         PRECISION  D(  *  ), E( * ), Q( * ), U(
                          LDU, * ), VT( LDVT, * ), WORK( * )


PURPOSE

       DBDSDC computes the singular value decomposition (SVD)  of
       a  real N-by-N (upper or lower) bidiagonal matrix B: B = U
       * S * VT, using a divide and conquer method, where S is  a
       diagonal  matrix  with non-negative diagonal elements (the
       singular values of B), and U and VT are orthogonal  matri­
       ces  of  left  and  right  singular vectors, respectively.
       DBDSDC can be used to compute  all  singular  values,  and
       optionally,  singular  vectors or singular vectors in com­
       pact form.

       This code makes very mild assumptions about floating point
       arithmetic. It will work on machines with a guard digit in
       add/subtract, or on those binary  machines  without  guard
       digits  which subtract like the Cray X-MP, Cray Y-MP, Cray
       C-90, or Cray-2.  It could conceivably fail on hexadecimal
       or  decimal  machines without guard digits, but we know of
       none.  See DLASD3 for details.

       The code currently call DLASDQ if singular values only are
       desired.   However, it can be slightly modified to compute
       singular values using the divide and conquer method.


ARGUMENTS

       UPLO    (input) CHARACTER*1
               = 'U':  B is upper bidiagonal.
               = 'L':  B is lower bidiagonal.

       COMPQ   (input) CHARACTER*1
               Specifies whether singular vectors are to be  com­
               puted as follows:
               = 'N':  Compute singular values only;
               = 'P':  Compute singular values and compute singu­
               lar vectors in compact form; = 'I':  Compute  sin­
               gular values and singular vectors.

               The order of the matrix B.  N >= 0.

       D       (input/output) DOUBLE PRECISION array, dimension
               (N)
               On entry, the n diagonal elements of the  bidiago­
               nal  matrix  B.   On exit, if INFO=0, the singular
               values of B.

       E       (input/output) DOUBLE PRECISION array, dimension
               (N)
               On  entry, the elements of E contain the offdiago­
               nal elements of the bidiagonal matrix whose SVD is
               desired.  On exit, E has been destroyed.

       U       (output) DOUBLE PRECISION array, dimension (LDU,N)
               If  COMPQ = 'I', then: On exit, if  INFO  =  0,  U
               contains the left singular vectors of the bidiago­
               nal matrix.  For other values of COMPQ, U  is  not
               referenced.

       LDU     (input) INTEGER
               The  leading  dimension of the array U.  LDU >= 1.
               If singular vectors are desired, then LDU >=  max(
               1, N ).

       VT      (output) DOUBLE PRECISION array, dimension
               (LDVT,N)
               If  COMPQ = 'I', then: On exit, if INFO =  0,  VT'
               contains the right singular vectors of the bidiag­
               onal matrix.  For other values of COMPQ, VT is not
               referenced.

       LDVT    (input) INTEGER
               The leading dimension of the array VT.  LDVT >= 1.
               If singular vectors are desired, then LDVT >= max(
               1, N ).

       Q       (output) DOUBLE PRECISION array, dimension (LDQ)
               If  COMPQ = 'P', then: On exit, if INFO = 0, Q and
               IQ contain the left and right singular vectors  in
               a compact form, requiring O(N log N) space instead
               of 2*N**2.  In particular, Q contains all the DOU­
               BLE  PRECISION  data  in LDQ >= N*(11 + 2*SMLSIZ +
               8*INT(LOG_2(N/(SMLSIZ+1)))) words of memory, where
               SMLSIZ  is  returned by ILAENV and is equal to the
               maximum size of the subproblems at the  bottom  of
               the  computation  tree  (usually  about  25).  For
               other values of COMPQ, Q is not referenced.

       IQ      (output) INTEGER array, dimension (LDIQ)
               If  COMPQ = 'P', then: On exit, if INFO = 0, Q and
               IQ  contain the left and right singular vectors in
               a compact form, requiring O(N log N) space instead

               data in LDIQ >= N*(3 + 3*INT(LOG_2(N/(SMLSIZ+1))))
               words  of  memory,  where  SMLSIZ  is  returned by
               ILAENV and is equal to the  maximum  size  of  the
               subproblems  at the bottom of the computation tree
               (usually about 25).  For other values of COMPQ, IQ
               is not referenced.

       WORK    (workspace) DOUBLE PRECISION array, dimension
               (LWORK)
               If COMPQ = 'N' then LWORK >= (4 * N).  If COMPQ  =
               'P'  then  LWORK  >= (6 * N).  If COMPQ = 'I' then
               LWORK >= (3 * N**2 + 4 * N).

       IWORK   (workspace) INTEGER array, dimension (8*N)

       INFO    (output) INTEGER
               = 0:  successful exit.
               < 0:  if INFO = -i, the i-th argument had an ille­
               gal value.
               >  0:  The algorithm failed to compute an singular
               value.  The update process of divide  and  conquer
               failed.


FURTHER DETAILS

       Based on contributions by
          Ming  Gu  and Huan Ren, Computer Science Division, Uni­
       versity of
          California at Berkeley, USA


Man(1) output converted with man2html