## SB03OV

### Construction of a complex plane rotation to annihilate a real number, modifying a complex number

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

Purpose

To construct a complex plane rotation such that, for a complex
number  a  and a real number  b,

( conjg( c )  s )*( a ) = ( d ),
(       -s    c ) ( b )   ( 0 )

where  d  is always real and is overwritten on  a,  so that on
return the imaginary part of  a  is zero.  b  is unaltered.

This routine has A and C declared as REAL, because it is intended
for use within a real Lyapunov solver and the REAL declarations
mean that a standard Fortran DOUBLE PRECISION version may be
readily constructed.  However A and C could safely be declared
COMPLEX in the calling program, although some systems may give a
type mismatch warning.

Specification
SUBROUTINE SB03OV( A, B, SMALL, C, S )
C     .. Scalar Arguments ..
DOUBLE PRECISION  B, S, SMALL
C     .. Array Arguments ..
DOUBLE PRECISION  A(2), C(2)

Arguments

Input/Output Parameters

A       (input/output) DOUBLE PRECISION array, dimension (2)
On entry, A(1) and A(2) must contain the real and
imaginary part, respectively, of the complex number a.
On exit, A(1) contains the real part of d, and A(2) is
set to zero.

B       (input) DOUBLE PRECISION
The real number b.

SMALL   (input) DOUBLE PRECISION
A small real number. If the norm d of [ a; b ] is smaller
than SMALL, then the rotation is taken as a unit matrix,
and A(1) and A(2) are set to d and 0, respectively.

C       (output) DOUBLE PRECISION array, dimension (2)
C(1) and C(2) contain the real and imaginary part,
respectively, of the complex number c, the cosines of
the plane rotation.

S       (output) DOUBLE PRECISION
The real number s, the sines of the plane rotation.