123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- *DECK DROTG
- SUBROUTINE DROTG (DA, DB, DC, DS)
- C***BEGIN PROLOGUE DROTG
- C***PURPOSE Construct a plane Givens rotation.
- C***LIBRARY SLATEC (BLAS)
- C***CATEGORY D1B10
- C***TYPE DOUBLE PRECISION (SROTG-S, DROTG-D, CROTG-C)
- C***KEYWORDS BLAS, GIVENS ROTATION, GIVENS TRANSFORMATION,
- C LINEAR ALGEBRA, VECTOR
- C***AUTHOR Lawson, C. L., (JPL)
- C Hanson, R. J., (SNLA)
- C Kincaid, D. R., (U. of Texas)
- C Krogh, F. T., (JPL)
- C***DESCRIPTION
- C
- C B L A S Subprogram
- C Description of Parameters
- C
- C --Input--
- C DA double precision scalar
- C DB double precision scalar
- C
- C --Output--
- C DA double precision result R
- C DB double precision result Z
- C DC double precision result
- C DS double precision result
- C
- C Construct the Givens transformation
- C
- C ( DC DS )
- C G = ( ) , DC**2 + DS**2 = 1 ,
- C (-DS DC )
- C
- C which zeros the second entry of the 2-vector (DA,DB)**T .
- C
- C The quantity R = (+/-)SQRT(DA**2 + DB**2) overwrites DA in
- C storage. The value of DB is overwritten by a value Z which
- C allows DC and DS to be recovered by the following algorithm.
- C
- C If Z=1 set DC=0.0 and DS=1.0
- C If ABS(Z) .LT. 1 set DC=SQRT(1-Z**2) and DS=Z
- C If ABS(Z) .GT. 1 set DC=1/Z and DS=SQRT(1-DC**2)
- C
- C Normally, the subprogram DROT(N,DX,INCX,DY,INCY,DC,DS) will
- C next be called to apply the transformation to a 2 by N matrix.
- C
- C***REFERENCES C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T.
- C Krogh, Basic linear algebra subprograms for Fortran
- C usage, Algorithm No. 539, Transactions on Mathematical
- C Software 5, 3 (September 1979), pp. 308-323.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 791001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE DROTG
- DOUBLE PRECISION DA, DB, DC, DS, U, V, R
- C***FIRST EXECUTABLE STATEMENT DROTG
- IF (ABS(DA) .LE. ABS(DB)) GO TO 10
- C
- C *** HERE ABS(DA) .GT. ABS(DB) ***
- C
- U = DA + DA
- V = DB / U
- C
- C NOTE THAT U AND R HAVE THE SIGN OF DA
- C
- R = SQRT(0.25D0 + V**2) * U
- C
- C NOTE THAT DC IS POSITIVE
- C
- DC = DA / R
- DS = V * (DC + DC)
- DB = DS
- DA = R
- RETURN
- C
- C *** HERE ABS(DA) .LE. ABS(DB) ***
- C
- 10 IF (DB .EQ. 0.0D0) GO TO 20
- U = DB + DB
- V = DA / U
- C
- C NOTE THAT U AND R HAVE THE SIGN OF DB
- C (R IS IMMEDIATELY STORED IN DA)
- C
- DA = SQRT(0.25D0 + V**2) * U
- C
- C NOTE THAT DS IS POSITIVE
- C
- DS = DB / DA
- DC = V * (DS + DS)
- IF (DC .EQ. 0.0D0) GO TO 15
- DB = 1.0D0 / DC
- RETURN
- 15 DB = 1.0D0
- RETURN
- C
- C *** HERE DA = DB = 0.0 ***
- C
- 20 DC = 1.0D0
- DS = 0.0D0
- RETURN
- C
- END
|