MB04WR

Generating orthogonal symplectic matrices defined as products of symplectic reflectors and Givens rotators

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

Purpose

  To generate orthogonal symplectic matrices U or V, defined as
  products of symplectic reflectors and Givens rotators

  U = diag( HU(1),HU(1) )  GU(1)  diag( FU(1),FU(1) )
      diag( HU(2),HU(2) )  GU(2)  diag( FU(2),FU(2) )
                           ....
      diag( HU(n),HU(n) )  GU(n)  diag( FU(n),FU(n) ),

  V = diag( HV(1),HV(1) )       GV(1)   diag( FV(1),FV(1) )
      diag( HV(2),HV(2) )       GV(2)   diag( FV(2),FV(2) )
                                ....
      diag( HV(n-1),HV(n-1) )  GV(n-1)  diag( FV(n-1),FV(n-1) ),

  as returned by the SLICOT Library routines MB04TS or MB04TB. The
  matrices U and V are returned in terms of their first N/2 rows:

              [  U1   U2 ]           [  V1   V2 ]
          U = [          ],      V = [          ].
              [ -U2   U1 ]           [ -V2   V1 ]

Specification
      SUBROUTINE MB04WR( JOB, TRANS, N, ILO, Q1, LDQ1, Q2, LDQ2, CS,
     $                   TAU, DWORK, LDWORK, INFO )
C     .. Scalar Arguments ..
      CHARACTER         JOB, TRANS
      INTEGER           ILO, INFO, LDQ1, LDQ2, LDWORK, N
C     .. Array Arguments ..
      DOUBLE PRECISION  CS(*), DWORK(*), Q1(LDQ1,*), Q2(LDQ2,*), TAU(*)

Arguments

Input/Output Parameters

  JOB     CHARACTER*1
          Specifies whether the matrix U or the matrix V is
          required:
          = 'U':  generate U;
          = 'V':  generate V.

  TRANS   CHARACTER*1
          If  JOB = 'U'  then TRANS must have the same value as
          the argument TRANA in the previous call of MB04TS or
          MB04TB.
          If  JOB = 'V'  then TRANS must have the same value as
          the argument TRANB in the previous call of MB04TS or
          MB04TB.

  N       (input) INTEGER
          The order of the matrices Q1 and Q2. N >= 0.

  ILO     (input) INTEGER
          ILO must have the same value as in the previous call of
          MB04TS or MB04TB. U and V are equal to the unit matrix
          except in the submatrices
          U([ilo:n n+ilo:2*n], [ilo:n n+ilo:2*n]) and
          V([ilo+1:n n+ilo+1:2*n], [ilo+1:n n+ilo+1:2*n]),
          respectively.
          1 <= ILO <= N, if N > 0; ILO = 1, if N = 0.

  Q1      (input/output) DOUBLE PRECISION array, dimension (LDQ1,N)
          On entry, if  JOB = 'U'  and  TRANS = 'N'  then the
          leading N-by-N part of this array must contain in its i-th
          column the vector which defines the elementary reflector
          FU(i).
          If  JOB = 'U'  and  TRANS = 'T'  or  TRANS = 'C' then the
          leading N-by-N part of this array must contain in its i-th
          row the vector which defines the elementary reflector
          FU(i).
          If  JOB = 'V'  and  TRANS = 'N'  then the leading N-by-N
          part of this array must contain in its i-th row the vector
          which defines the elementary reflector FV(i).
          If  JOB = 'V'  and  TRANS = 'T'  or  TRANS = 'C' then the
          leading N-by-N part of this array must contain in its i-th
          column the vector which defines the elementary reflector
          FV(i).
          On exit, if  JOB = 'U'  and  TRANS = 'N'  then the leading
          N-by-N part of this array contains the matrix U1.
          If  JOB = 'U'  and  TRANS = 'T'  or  TRANS = 'C' then the
          leading N-by-N part of this array contains the matrix
          U1**T.
          If  JOB = 'V'  and  TRANS = 'N'  then the leading N-by-N
          part of this array contains the matrix V1**T.
          If  JOB = 'V'  and  TRANS = 'T'  or  TRANS = 'C' then the
          leading N-by-N part of this array contains the matrix V1.

  LDQ1    INTEGER
          The leading dimension of the array Q1.  LDQ1 >= MAX(1,N).

  Q2      (input/output) DOUBLE PRECISION array, dimension (LDQ2,N)
          On entry, if  JOB = 'U'  then the leading N-by-N part of
          this array must contain in its i-th column the vector
          which defines the elementary reflector HU(i).
          If  JOB = 'V'  then the leading N-by-N part of this array
          must contain in its i-th row the vector which defines the
          elementary reflector HV(i).
          On exit, if  JOB = 'U'  then the leading N-by-N part of
          this array contains the matrix U2.
          If  JOB = 'V'  then the leading N-by-N part of this array
          contains the matrix V2**T.

  LDQ2    INTEGER
          The leading dimension of the array Q2.  LDQ2 >= MAX(1,N).

  CS      (input) DOUBLE PRECISION array, dimension (2N)
          On entry, if  JOB = 'U'  then the first 2N elements of
          this array must contain the cosines and sines of the
          symplectic Givens rotators GU(i).
          If  JOB = 'V'  then the first 2N-2 elements of this array
          must contain the cosines and sines of the symplectic
          Givens rotators GV(i).

  TAU     (input) DOUBLE PRECISION array, dimension (N)
          On entry, if  JOB = 'U'  then the first N elements of
          this array must contain the scalar factors of the
          elementary reflectors FU(i).
          If  JOB = 'V'  then the first N-1 elements of this array
          must contain the scalar factors of the elementary
          reflectors FV(i).

Workspace
  DWORK   DOUBLE PRECISION array, dimension (LDWORK)
          On exit, if INFO = 0,  DWORK(1)  returns the optimal
          value of LDWORK.
          On exit, if  INFO = -12,  DWORK(1)  returns the minimum
          value of LDWORK.

  LDWORK  INTEGER
          The length of the array DWORK.
          LDWORK >= MAX(1,2*(N-ILO+1)).

Error Indicator
  INFO    INTEGER
          = 0:  successful exit;
          < 0:  if INFO = -i, the i-th argument had an illegal
                value.

References
  [1] Benner, P., Mehrmann, V., and Xu, H.
      A numerically stable, structure preserving method for
      computing the eigenvalues of real Hamiltonian or symplectic
      pencils. Numer. Math., Vol 78 (3), pp. 329-358, 1998.

  [2] Kressner, D.
      Block algorithms for orthogonal symplectic factorizations.
      BIT, 43 (4), pp. 775-790, 2003.

Further Comments
  None
Example

Program Text

  None
Program Data
  None
Program Results
  None

Return to Supporting Routines index