Purpose
  To estimate the "separation" between the matrices op(A) and
  op(A)',
  sepd(op(A),op(A)') = min norm(op(A)'*X*op(A) - X)/norm(X)
                     = 1 / norm(inv(Omega))
  and/or the 1-norm of Theta, where op(A) = A or A' (A**T), and
  Omega and Theta are linear operators associated to the real
  discrete-time Lyapunov matrix equation
         op(A)'*X*op(A) - X = C,
  defined by
  Omega(W) = op(A)'*W*op(A) - W,
  Theta(W) = inv(Omega(op(W)'*X*op(A) + op(A)'*X*op(W))).
  The 1-norm condition estimators are used.
Specification
      SUBROUTINE SB03SY( JOB, TRANA, LYAPUN, N, T, LDT, U, LDU, XA,
     $                   LDXA, SEPD, THNORM, IWORK, DWORK, LDWORK,
     $                   INFO )
C     .. Scalar Arguments ..
      CHARACTER          JOB, LYAPUN, TRANA
      INTEGER            INFO, LDT, LDU, LDWORK, LDXA, N
      DOUBLE PRECISION   SEPD, THNORM
C     .. Array Arguments ..
      INTEGER            IWORK( * )
      DOUBLE PRECISION   DWORK( * ), T( LDT, * ), U( LDU, * ),
     $                   XA( LDXA, * )
Arguments
Mode Parameters
  JOB     CHARACTER*1
          Specifies the computation to be performed, as follows:
          = 'S':  Compute the separation only;
          = 'T':  Compute the norm of Theta only;
          = 'B':  Compute both the separation and the norm of Theta.
  TRANA   CHARACTER*1
          Specifies the form of op(A) to be used, as follows:
          = 'N':  op(A) = A    (No transpose);
          = 'T':  op(A) = A**T (Transpose);
          = 'C':  op(A) = A**T (Conjugate transpose = Transpose).
  LYAPUN  CHARACTER*1
          Specifies whether or not the original Lyapunov equations
          should be solved, as follows:
          = 'O':  Solve the original Lyapunov equations, updating
                  the right-hand sides and solutions with the
                  matrix U, e.g., X <-- U'*X*U;
          = 'R':  Solve reduced Lyapunov equations only, without
                  updating the right-hand sides and solutions.
Input/Output Parameters
  N       (input) INTEGER
          The order of the matrices A and X.  N >= 0.
  T       (input) DOUBLE PRECISION array, dimension (LDT,N)
          The leading N-by-N upper Hessenberg part of this array
          must contain the upper quasi-triangular matrix T in Schur
          canonical form from a Schur factorization of A.
  LDT     INTEGER
          The leading dimension of array T.  LDT >= MAX(1,N).
  U       (input) DOUBLE PRECISION array, dimension (LDU,N)
          The leading N-by-N part of this array must contain the
          orthogonal matrix U from a real Schur factorization of A.
          If LYAPUN = 'R', the array U is not referenced.
  LDU     INTEGER
          The leading dimension of array U.
          LDU >= 1,        if LYAPUN = 'R';
          LDU >= MAX(1,N), if LYAPUN = 'O'.
  XA      (input) DOUBLE PRECISION array, dimension (LDXA,N)
          The leading N-by-N part of this array must contain the
          matrix product X*op(A), if LYAPUN = 'O', or U'*X*U*op(T),
          if LYAPUN = 'R', in the Lyapunov equation.
          If JOB = 'S', the array XA is not referenced.
  LDXA    INTEGER
          The leading dimension of array XA.
          LDXA >= 1,        if JOB = 'S';
          LDXA >= MAX(1,N), if JOB = 'T' or 'B'.
  SEPD    (output) DOUBLE PRECISION
          If JOB = 'S' or JOB = 'B', and INFO >= 0, SEPD contains
          the estimated quantity sepd(op(A),op(A)').
          If JOB = 'T' or N = 0, SEPD is not referenced.
  THNORM  (output) DOUBLE PRECISION
          If JOB = 'T' or JOB = 'B', and INFO >= 0, THNORM contains
          the estimated 1-norm of operator Theta.
          If JOB = 'S' or N = 0, THNORM is not referenced.
Workspace
  IWORK   INTEGER array, dimension (N*N)
  DWORK   DOUBLE PRECISION array, dimension (LDWORK)
  LDWORK  INTEGER
          The length of the array DWORK.
          LDWORK >= 0,            if N = 0;
          LDWORK >= MAX(3,2*N*N), if N > 0.
Error Indicator
  INFO    INTEGER
          = 0:  successful exit;
          < 0:  if INFO = -i, the i-th argument had an illegal
                value;
          = N+1:  if T has (almost) reciprocal eigenvalues;
                perturbed values were used to solve Lyapunov
                equations (but the matrix T is unchanged).
Method
  SEPD is defined as
         sepd( op(A), op(A)' ) = sigma_min( K )
  where sigma_min(K) is the smallest singular value of the
  N*N-by-N*N matrix
     K = kprod( op(A)', op(A)' ) - I(N**2).
  I(N**2) is an N*N-by-N*N identity matrix, and kprod denotes the
  Kronecker product. The routine estimates sigma_min(K) by the
  reciprocal of an estimate of the 1-norm of inverse(K), computed as
  suggested in [1]. This involves the solution of several discrete-
  time Lyapunov equations, either direct or transposed. The true
  reciprocal 1-norm of inverse(K) cannot differ from sigma_min(K) by
  more than a factor of N.
  The 1-norm of Theta is estimated similarly.
References
  [1] Higham, N.J.
      FORTRAN codes for estimating the one-norm of a real or
      complex matrix, with applications to condition estimation.
      ACM Trans. Math. Softw., 14, pp. 381-396, 1988.
Numerical Aspects
3 The algorithm requires 0(N ) operations.Further Comments
When SEPD is zero, the routine returns immediately, with THNORM (if requested) not set. In this case, the equation is singular. The option LYAPUN = 'R' may occasionally produce slightly worse or better estimates, and it is much faster than the option 'O'.Example
Program Text
NoneProgram Data
NoneProgram Results
None