--- a +++ b/src/SB03OV.f @@ -0,0 +1,105 @@ + 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