## MB02NY

### Separation of a zero singular value of a bidiagonal submatrix

[Specification] [Arguments] [Method] [References] [Comments] [Example]

Purpose

      To separate a zero singular value of a bidiagonal submatrix of
      order k, k <= p, of the bidiagonal matrix

                |Q(1) E(1)  0    ...   0   |
                | 0   Q(2) E(2)        .   |
            J = | .                    .   |
                | .                  E(p-1)|
                | 0   ...  ...   ...  Q(p) |

      with p = MIN(M,N), by annihilating one or two superdiagonal
      elements E(i-1) (if i > 1) and/or E(i) (if i < k).

Specification

          SUBROUTINE MB02NY( UPDATU, UPDATV, M, N, I, K, Q, E, U, LDU, V,
         $                   LDV, DWORK )
    C     .. Scalar Arguments ..
          LOGICAL           UPDATU, UPDATV
          INTEGER           I, K, LDU, LDV, M, N
    C     .. Array Arguments ..
          DOUBLE PRECISION  DWORK(*), E(*), Q(*), U(LDU,*), V(LDV,*)

Arguments

Mode Parameters

      UPDATU  LOGICAL
              Indicates whether the user wishes to accumulate in a
              matrix U the left-hand Givens rotations S, as follows:
              = .FALSE.:  Do not form U;
              = .TRUE. :  The given matrix U is updated (postmultiplied)
                          by the left-hand Givens rotations S.

      UPDATV  LOGICAL
              Indicates whether the user wishes to accumulate in a
              matrix V the right-hand Givens rotations T, as follows:
              = .FALSE.:  Do not form V;
              = .TRUE. :  The given matrix V is updated (postmultiplied)
                          by the right-hand Givens rotations T.

Input/Output Parameters

      M       (input) INTEGER
              The number of rows of the matrix U.  M >= 0.

      N       (input) INTEGER
              The number of rows of the matrix V.  N >= 0.

      I       (input) INTEGER
              The index of the negligible diagonal entry Q(I) of the
              bidiagonal matrix J, I <= p.

      K       (input) INTEGER
              The index of the last diagonal entry of the considered
              bidiagonal submatrix of J, i.e., E(K-1) is considered
              negligible, K <= p.

      Q       (input/output) DOUBLE PRECISION array, dimension (p)
              where p = MIN(M,N).
              On entry, Q must contain the diagonal entries of the
              bidiagonal matrix J.
              On exit, Q contains the diagonal entries of the
              transformed bidiagonal matrix S' J T.

      E       (input/output) DOUBLE PRECISION array, dimension (p-1)
              On entry, E must contain the superdiagonal entries of J.
              On exit, E contains the superdiagonal entries of the
              transformed bidiagonal matrix S' J T.

      U       (input/output) DOUBLE PRECISION array, dimension (LDU,p)
              On entry, if UPDATU = .TRUE., U must contain the M-by-p
              left transformation matrix.
              On exit, if UPDATU = .TRUE., the Givens rotations S on the
              left, annihilating E(i) if i < k, have been postmultiplied
              into U.
              U is not referenced if UPDATU = .FALSE..

      LDU     INTEGER
              The leading dimension of the array U.
              LDU >= max(1,M) if UPDATU = .TRUE.;
              LDU >= 1        if UPDATU = .FALSE..

      V       (input/output) DOUBLE PRECISION array, dimension (LDV,p)
              On entry, if UPDATV = .TRUE., V must contain the N-by-p
              right transformation matrix.
              On exit, if UPDATV = .TRUE., the Givens rotations T on the
              right, annihilating E(i-1) if i > 1,  have been
              postmultiplied into V.
              V is not referenced if UPDATV = .FALSE..

      LDV     INTEGER
              The leading dimension of the array V.
              LDV >= max(1,N) if UPDATV = .TRUE.;
              LDV >= 1        if UPDATV = .FALSE..

Workspace

      DWORK   DOUBLE PRECISION array, dimension (MAX(1,LDWORK))
              LDWORK >= 2*MAX(K-I,I-1),  if UPDATV = UPDATU = .TRUE.;
              LDWORK >= 2*(K-I), if UPDATU = .TRUE., UPDATV = .FALSE.;
              LDWORK >= 2*(I-1), if UPDATV = .TRUE., UPDATU = .FALSE.;
              LDWORK >= 1,       if UPDATU = UPDATV = .FALSE..

Method

      Let the considered bidiagonal submatrix be

                |Q(1) E(1)  0                    ...   0   |
                | 0   Q(2) E(2)                        .   |
                | .                                    .   |
                | .           Q(i-1) E(i-1)            .   |
           Jk = | .                   Q(i) E(i)        .   |.
                | .                       Q(i+1) .     .   |
                | .                              ..    .   |
                | .                                  E(k-1)|
                | 0    ...                       ...  Q(k) |

      A zero singular value of Jk manifests itself by a zero diagonal
      entry Q(i) or in practice, a negligible value of Q(i).
      When a negligible diagonal element Q(i) in Jk is present, the
      bidiagonal submatrix Jk is split by the routine into 2 or 3
      unreduced bidiagonal submatrices by annihilating E(i) (if i < k)
      using Givens rotations S on the left and by annihilating E(i-1)
      (if i > 1) using Givens rotations T on the right until Jk is
      reduced to the form:

                |Q(1) E(1)  0                ...   0   |
                | 0         .                ...   .   |
                | .                          ...   .   |
                | .       Q(i-1) 0                 .   |
      S' Jk T = | .              0   0             .   |.
                | .                 Q(i+1)   .     .   |
                | .                          ..    .   |
                | .                              E(k-1)|
                | 0    ...                   ...  Q(k) |

      For more details, see [1, pp.11.12-11.14].

References

      [1] Dongarra, J.J., Bunch, J.R., Moler C.B. and Stewart, G.W.
          LINPACK User's Guide.
          SIAM, Philadelphia, 1979.

Numerical Aspects

      The algorithm is backward stable.

Further Comments

      None

Example

Program Text

      None

Program Data

      None

Program Results

      None

Return to Supporting Routines index