106 lines
3.3 KiB
Fortran
106 lines
3.3 KiB
Fortran
SUBROUTINE SB03OV( A, B, C, S )
|
|
C
|
|
C SLICOT RELEASE 5.0.
|
|
C
|
|
C Copyright (c) 2002-2009 NICONET e.V.
|
|
C
|
|
C This program is free software: you can redistribute it and/or
|
|
C modify it under the terms of the GNU General Public License as
|
|
C published by the Free Software Foundation, either version 2 of
|
|
C the License, or (at your option) any later version.
|
|
C
|
|
C This program is distributed in the hope that it will be useful,
|
|
C but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
C GNU General Public License for more details.
|
|
C
|
|
C You should have received a copy of the GNU General Public License
|
|
C along with this program. If not, see
|
|
C <http://www.gnu.org/licenses/>.
|
|
C
|
|
C PURPOSE
|
|
C
|
|
C To construct a complex plane rotation such that, for a complex
|
|
C number a and a real number b,
|
|
C
|
|
C ( conjg( c ) s )*( a ) = ( d ),
|
|
C ( -s c ) ( b ) ( 0 )
|
|
C
|
|
C where d is always real and is overwritten on a, so that on
|
|
C return the imaginary part of a is zero. b is unaltered.
|
|
C
|
|
C This routine has A and C declared as REAL, because it is intended
|
|
C for use within a real Lyapunov solver and the REAL declarations
|
|
C mean that a standard Fortran DOUBLE PRECISION version may be
|
|
C readily constructed. However A and C could safely be declared
|
|
C COMPLEX in the calling program, although some systems may give a
|
|
C type mismatch warning.
|
|
C
|
|
C ARGUMENTS
|
|
C
|
|
C Input/Output Parameters
|
|
C
|
|
C A (input/output) DOUBLE PRECISION array, dimension (2)
|
|
C On entry, A(1) and A(2) must contain the real and
|
|
C imaginary part, respectively, of the complex number a.
|
|
C On exit, A(1) contains the real part of d, and A(2) is
|
|
C set to zero.
|
|
C
|
|
C B (input) DOUBLE PRECISION
|
|
C The real number b.
|
|
C
|
|
C C (output) DOUBLE PRECISION array, dimension (2)
|
|
C C(1) and C(2) contain the real and imaginary part,
|
|
C respectively, of the complex number c, the cosines of
|
|
C the plane rotation.
|
|
C
|
|
C S (output) DOUBLE PRECISION
|
|
C The real number s, the sines of the plane rotation.
|
|
C
|
|
C CONTRIBUTOR
|
|
C
|
|
C Release 3.0: V. Sima, Katholieke Univ. Leuven, Belgium, Aug. 1997.
|
|
C Supersedes Release 2.0 routine SB03CV by Sven Hammarling,
|
|
C NAG Ltd., United Kingdom, May 1985.
|
|
C
|
|
C REVISIONS
|
|
C
|
|
C Dec. 1997.
|
|
C
|
|
C KEYWORDS
|
|
C
|
|
C Lyapunov equation, orthogonal transformation.
|
|
C
|
|
C *****************************************************************
|
|
C
|
|
C .. Parameters ..
|
|
DOUBLE PRECISION ONE, ZERO
|
|
PARAMETER ( ONE = 1.0D0, ZERO = 0.0D0 )
|
|
C .. Scalar Arguments ..
|
|
DOUBLE PRECISION B, S
|
|
C .. Array Arguments ..
|
|
DOUBLE PRECISION A(2), C(2)
|
|
C .. Local Scalars ..
|
|
DOUBLE PRECISION D
|
|
C .. External Functions ..
|
|
DOUBLE PRECISION DLAPY3
|
|
EXTERNAL DLAPY3
|
|
C .. Executable Statements ..
|
|
C
|
|
D = DLAPY3( A(1), A(2), B )
|
|
IF ( D.EQ.ZERO ) THEN
|
|
C(1) = ONE
|
|
C(2) = ZERO
|
|
S = ZERO
|
|
ELSE
|
|
C(1) = A(1)/D
|
|
C(2) = A(2)/D
|
|
S = B/D
|
|
A(1) = D
|
|
A(2) = ZERO
|
|
END IF
|
|
C
|
|
RETURN
|
|
C *** Last line of SB03OV ***
|
|
END
|