drotg.f 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. *DECK DROTG
  2. SUBROUTINE DROTG (DA, DB, DC, DS)
  3. C***BEGIN PROLOGUE DROTG
  4. C***PURPOSE Construct a plane Givens rotation.
  5. C***LIBRARY SLATEC (BLAS)
  6. C***CATEGORY D1B10
  7. C***TYPE DOUBLE PRECISION (SROTG-S, DROTG-D, CROTG-C)
  8. C***KEYWORDS BLAS, GIVENS ROTATION, GIVENS TRANSFORMATION,
  9. C LINEAR ALGEBRA, VECTOR
  10. C***AUTHOR Lawson, C. L., (JPL)
  11. C Hanson, R. J., (SNLA)
  12. C Kincaid, D. R., (U. of Texas)
  13. C Krogh, F. T., (JPL)
  14. C***DESCRIPTION
  15. C
  16. C B L A S Subprogram
  17. C Description of Parameters
  18. C
  19. C --Input--
  20. C DA double precision scalar
  21. C DB double precision scalar
  22. C
  23. C --Output--
  24. C DA double precision result R
  25. C DB double precision result Z
  26. C DC double precision result
  27. C DS double precision result
  28. C
  29. C Construct the Givens transformation
  30. C
  31. C ( DC DS )
  32. C G = ( ) , DC**2 + DS**2 = 1 ,
  33. C (-DS DC )
  34. C
  35. C which zeros the second entry of the 2-vector (DA,DB)**T .
  36. C
  37. C The quantity R = (+/-)SQRT(DA**2 + DB**2) overwrites DA in
  38. C storage. The value of DB is overwritten by a value Z which
  39. C allows DC and DS to be recovered by the following algorithm.
  40. C
  41. C If Z=1 set DC=0.0 and DS=1.0
  42. C If ABS(Z) .LT. 1 set DC=SQRT(1-Z**2) and DS=Z
  43. C If ABS(Z) .GT. 1 set DC=1/Z and DS=SQRT(1-DC**2)
  44. C
  45. C Normally, the subprogram DROT(N,DX,INCX,DY,INCY,DC,DS) will
  46. C next be called to apply the transformation to a 2 by N matrix.
  47. C
  48. C***REFERENCES C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T.
  49. C Krogh, Basic linear algebra subprograms for Fortran
  50. C usage, Algorithm No. 539, Transactions on Mathematical
  51. C Software 5, 3 (September 1979), pp. 308-323.
  52. C***ROUTINES CALLED (NONE)
  53. C***REVISION HISTORY (YYMMDD)
  54. C 791001 DATE WRITTEN
  55. C 890531 Changed all specific intrinsics to generic. (WRB)
  56. C 890531 REVISION DATE from Version 3.2
  57. C 891214 Prologue converted to Version 4.0 format. (BAB)
  58. C 920501 Reformatted the REFERENCES section. (WRB)
  59. C***END PROLOGUE DROTG
  60. DOUBLE PRECISION DA, DB, DC, DS, U, V, R
  61. C***FIRST EXECUTABLE STATEMENT DROTG
  62. IF (ABS(DA) .LE. ABS(DB)) GO TO 10
  63. C
  64. C *** HERE ABS(DA) .GT. ABS(DB) ***
  65. C
  66. U = DA + DA
  67. V = DB / U
  68. C
  69. C NOTE THAT U AND R HAVE THE SIGN OF DA
  70. C
  71. R = SQRT(0.25D0 + V**2) * U
  72. C
  73. C NOTE THAT DC IS POSITIVE
  74. C
  75. DC = DA / R
  76. DS = V * (DC + DC)
  77. DB = DS
  78. DA = R
  79. RETURN
  80. C
  81. C *** HERE ABS(DA) .LE. ABS(DB) ***
  82. C
  83. 10 IF (DB .EQ. 0.0D0) GO TO 20
  84. U = DB + DB
  85. V = DA / U
  86. C
  87. C NOTE THAT U AND R HAVE THE SIGN OF DB
  88. C (R IS IMMEDIATELY STORED IN DA)
  89. C
  90. DA = SQRT(0.25D0 + V**2) * U
  91. C
  92. C NOTE THAT DS IS POSITIVE
  93. C
  94. DS = DB / DA
  95. DC = V * (DS + DS)
  96. IF (DC .EQ. 0.0D0) GO TO 15
  97. DB = 1.0D0 / DC
  98. RETURN
  99. 15 DB = 1.0D0
  100. RETURN
  101. C
  102. C *** HERE DA = DB = 0.0 ***
  103. C
  104. 20 DC = 1.0D0
  105. DS = 0.0D0
  106. RETURN
  107. C
  108. END