<HTML>
<HEAD><TITLE>MB03AB - SLICOT Library Routine Documentation</TITLE>
</HEAD>
<BODY>
<H2><A Name="MB03AB">MB03AB</A></H2>
<H3>
Reducing the first column of a real Wilkinson shift polynomial for a product of matrices to the first unit vector (variant with explicit shifts)
</H3>
<A HREF ="#Specification"><B>[Specification]</B></A>
<A HREF ="#Arguments"><B>[Arguments]</B></A>
<A HREF ="#Method"><B>[Method]</B></A>
<A HREF ="#References"><B>[References]</B></A>
<A HREF ="#Comments"><B>[Comments]</B></A>
<A HREF ="#Example"><B>[Example]</B></A>
<P>
<B><FONT SIZE="+1">Purpose</FONT></B>
<PRE>
To compute two Givens rotations (C1,S1) and (C2,S2) such that the
orthogonal matrix
[ Q 0 ] [ C1 S1 0 ] [ 1 0 0 ]
Z = [ ], Q := [ -S1 C1 0 ] * [ 0 C2 S2 ],
[ 0 I ] [ 0 0 1 ] [ 0 -S2 C2 ]
makes the first column of the real Wilkinson double shift
polynomial of the product of matrices in periodic upper Hessenberg
form, stored in the array A, parallel to the first unit vector.
Only the rotation defined by C1 and S1 is needed for the real
Wilkinson single shift polynomial (see the SLICOT Library routines
MB03BE or MB03BF). The shifts are defined based on the eigenvalues
(computed externally by the SLICOT Library routine MB03BB) of the
trailing 2-by-2 submatrix of the matrix product. See the
definitions of the arguments W1 and W2.
</PRE>
<A name="Specification"><B><FONT SIZE="+1">Specification</FONT></B></A>
<PRE>
SUBROUTINE MB03AB( SHFT, K, N, AMAP, S, SINV, A, LDA1, LDA2, W1,
$ W2, C1, S1, C2, S2 )
C .. Scalar Arguments ..
CHARACTER SHFT
INTEGER K, LDA1, LDA2, N, SINV
DOUBLE PRECISION C1, C2, S1, S2, W1, W2
C .. Array Arguments ..
INTEGER AMAP(*), S(*)
DOUBLE PRECISION A(LDA1,LDA2,*)
</PRE>
<A name="Arguments"><B><FONT SIZE="+1">Arguments</FONT></B></A>
<P>
<B>Mode Parameters</B>
<PRE>
SHFT CHARACTER*1
Specifies the number and type of shifts employed by the
shift polynomial, as follows:
= 'C': two complex conjugate shifts;
= 'D': two real identical shifts;
= 'R': two real shifts;
= 'S': one real shift.
When the eigenvalues are complex conjugate, this argument
must be set to 'C'.
</PRE>
<B>Input/Output Parameters</B>
<PRE>
K (input) INTEGER
The number of factors. K >= 1.
N (input) INTEGER
The order of the factors in the array A.
N >= 2, for a single shift polynomial;
N >= 3, for a double shift polynomial.
AMAP (input) INTEGER array, dimension (K)
The map for accessing the factors, i.e., if AMAP(I) = J,
then the factor A_I is stored at the J-th position in A.
AMAP(1) is the pointer to the Hessenberg matrix, defined
by A(:,:,AMAP(1)).
S (input) INTEGER array, dimension (K)
The signature array. Each entry of S must be 1 or -1.
SINV (input) INTEGER
Signature multiplier. Entries of S are virtually
multiplied by SINV.
A (input) DOUBLE PRECISION array, dimension (LDA1,LDA2,K)
The leading N-by-N-by-K part of this array must contain an
n-by-n product (implicitly represented by its K factors)
in periodic upper Hessenberg form.
LDA1 INTEGER
The first leading dimension of the array A. LDA1 >= N.
LDA2 INTEGER
The second leading dimension of the array A. LDA2 >= N.
W1 (input) DOUBLE PRECISION
The real part of the first eigenvalue.
If SHFT = 'S', this argument is not used.
W2 (input) DOUBLE PRECISION
The second eigenvalue, if both eigenvalues are real, else
the imaginary part of the complex conjugate pair.
C1 (output) DOUBLE PRECISION
S1 (output) DOUBLE PRECISION
On exit, C1 and S1 contain the parameters for the first
Givens rotation.
C2 (output) DOUBLE PRECISION
S2 (output) DOUBLE PRECISION
On exit, C2 and S2 contain the parameters for the second
Givens rotation. If SHFT = 'S', C2 = 1, S2 = 0.
</PRE>
<A name="Method"><B><FONT SIZE="+1">Method</FONT></B></A>
<PRE>
Givens rotations are properly computed and applied.
</PRE>
<A name="Comments"><B><FONT SIZE="+1">Further Comments</FONT></B></A>
<PRE>
None
</PRE>
<A name="Example"><B><FONT SIZE="+1">Example</FONT></B></A>
<P>
<B>Program Text</B>
<PRE>
None
</PRE>
<B>Program Data</B>
<PRE>
None
</PRE>
<B>Program Results</B>
<PRE>
None
</PRE>
<HR>
<A HREF=support.html><B>Return to Supporting Routines index</B></A></BODY>
</HTML>