srotmg.f 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. *DECK SROTMG
  2. SUBROUTINE SROTMG (SD1, SD2, SX1, SY1, SPARAM)
  3. C***BEGIN PROLOGUE SROTMG
  4. C***PURPOSE Construct a modified Givens transformation.
  5. C***LIBRARY SLATEC (BLAS)
  6. C***CATEGORY D1B10
  7. C***TYPE SINGLE PRECISION (SROTMG-S, DROTMG-D)
  8. C***KEYWORDS BLAS, LINEAR ALGEBRA, MODIFIED GIVENS ROTATION, VECTOR
  9. C***AUTHOR Lawson, C. L., (JPL)
  10. C Hanson, R. J., (SNLA)
  11. C Kincaid, D. R., (U. of Texas)
  12. C Krogh, F. T., (JPL)
  13. C***DESCRIPTION
  14. C
  15. C B L A S Subprogram
  16. C Description of Parameters
  17. C
  18. C --Input--
  19. C SD1 single precision scalar
  20. C SD2 single precision scalar
  21. C SX1 single precision scalar
  22. C SY2 single precision scalar
  23. C SPARAM S.P. 5-vector. SPARAM(1)=SFLAG defined below.
  24. C Locations 2-5 contain the rotation matrix.
  25. C
  26. C --Output--
  27. C SD1 changed to represent the effect of the transformation
  28. C SD2 changed to represent the effect of the transformation
  29. C SX1 changed to represent the effect of the transformation
  30. C SY2 unchanged
  31. C
  32. C Construct the modified Givens transformation matrix H which zeros
  33. C the second component of the 2-vector (SQRT(SD1)*SX1,SQRT(SD2)*
  34. C SY2)**T.
  35. C With SPARAM(1)=SFLAG, H has one of the following forms:
  36. C
  37. C SFLAG=-1.E0 SFLAG=0.E0 SFLAG=1.E0 SFLAG=-2.E0
  38. C
  39. C (SH11 SH12) (1.E0 SH12) (SH11 1.E0) (1.E0 0.E0)
  40. C H=( ) ( ) ( ) ( )
  41. C (SH21 SH22), (SH21 1.E0), (-1.E0 SH22), (0.E0 1.E0).
  42. C
  43. C Locations 2-5 of SPARAM contain SH11, SH21, SH12, and SH22,
  44. C respectively. (Values of 1.E0, -1.E0, or 0.E0 implied by the
  45. C value of SPARAM(1) are not stored in SPARAM.)
  46. C
  47. C***REFERENCES C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T.
  48. C Krogh, Basic linear algebra subprograms for Fortran
  49. C usage, Algorithm No. 539, Transactions on Mathematical
  50. C Software 5, 3 (September 1979), pp. 308-323.
  51. C***ROUTINES CALLED (NONE)
  52. C***REVISION HISTORY (YYMMDD)
  53. C 780301 DATE WRITTEN
  54. C 861211 REVISION DATE from Version 3.2
  55. C 891214 Prologue converted to Version 4.0 format. (BAB)
  56. C 920316 Prologue corrected. (WRB)
  57. C 920501 Reformatted the REFERENCES section. (WRB)
  58. C***END PROLOGUE SROTMG
  59. DIMENSION SPARAM(5)
  60. SAVE ZERO, ONE, TWO, GAM, GAMSQ, RGAMSQ
  61. DATA ZERO, ONE, TWO /0.0E0, 1.0E0, 2.0E0/
  62. DATA GAM, GAMSQ, RGAMSQ /4096.0E0, 1.67772E7, 5.96046E-8/
  63. C***FIRST EXECUTABLE STATEMENT SROTMG
  64. IF (.NOT. SD1 .LT. ZERO) GO TO 10
  65. C GO ZERO-H-D-AND-SX1..
  66. GO TO 60
  67. 10 CONTINUE
  68. C CASE-SD1-NONNEGATIVE
  69. SP2=SD2*SY1
  70. IF (.NOT. SP2 .EQ. ZERO) GO TO 20
  71. SFLAG=-TWO
  72. GO TO 260
  73. C REGULAR-CASE..
  74. 20 CONTINUE
  75. SP1=SD1*SX1
  76. SQ2=SP2*SY1
  77. SQ1=SP1*SX1
  78. C
  79. IF (.NOT. ABS(SQ1) .GT. ABS(SQ2)) GO TO 40
  80. SH21=-SY1/SX1
  81. SH12=SP2/SP1
  82. C
  83. SU=ONE-SH12*SH21
  84. C
  85. IF (.NOT. SU .LE. ZERO) GO TO 30
  86. C GO ZERO-H-D-AND-SX1..
  87. GO TO 60
  88. 30 CONTINUE
  89. SFLAG=ZERO
  90. SD1=SD1/SU
  91. SD2=SD2/SU
  92. SX1=SX1*SU
  93. C GO SCALE-CHECK..
  94. GO TO 100
  95. 40 CONTINUE
  96. IF (.NOT. SQ2 .LT. ZERO) GO TO 50
  97. C GO ZERO-H-D-AND-SX1..
  98. GO TO 60
  99. 50 CONTINUE
  100. SFLAG=ONE
  101. SH11=SP1/SP2
  102. SH22=SX1/SY1
  103. SU=ONE+SH11*SH22
  104. STEMP=SD2/SU
  105. SD2=SD1/SU
  106. SD1=STEMP
  107. SX1=SY1*SU
  108. C GO SCALE-CHECK
  109. GO TO 100
  110. C PROCEDURE..ZERO-H-D-AND-SX1..
  111. 60 CONTINUE
  112. SFLAG=-ONE
  113. SH11=ZERO
  114. SH12=ZERO
  115. SH21=ZERO
  116. SH22=ZERO
  117. C
  118. SD1=ZERO
  119. SD2=ZERO
  120. SX1=ZERO
  121. C RETURN..
  122. GO TO 220
  123. C PROCEDURE..FIX-H..
  124. 70 CONTINUE
  125. IF (.NOT. SFLAG .GE. ZERO) GO TO 90
  126. C
  127. IF (.NOT. SFLAG .EQ. ZERO) GO TO 80
  128. SH11=ONE
  129. SH22=ONE
  130. SFLAG=-ONE
  131. GO TO 90
  132. 80 CONTINUE
  133. SH21=-ONE
  134. SH12=ONE
  135. SFLAG=-ONE
  136. 90 CONTINUE
  137. GO TO IGO,(120,150,180,210)
  138. C PROCEDURE..SCALE-CHECK
  139. 100 CONTINUE
  140. 110 CONTINUE
  141. IF (.NOT. SD1 .LE. RGAMSQ) GO TO 130
  142. IF (SD1 .EQ. ZERO) GO TO 160
  143. ASSIGN 120 TO IGO
  144. C FIX-H..
  145. GO TO 70
  146. 120 CONTINUE
  147. SD1=SD1*GAM**2
  148. SX1=SX1/GAM
  149. SH11=SH11/GAM
  150. SH12=SH12/GAM
  151. GO TO 110
  152. 130 CONTINUE
  153. 140 CONTINUE
  154. IF (.NOT. SD1 .GE. GAMSQ) GO TO 160
  155. ASSIGN 150 TO IGO
  156. C FIX-H..
  157. GO TO 70
  158. 150 CONTINUE
  159. SD1=SD1/GAM**2
  160. SX1=SX1*GAM
  161. SH11=SH11*GAM
  162. SH12=SH12*GAM
  163. GO TO 140
  164. 160 CONTINUE
  165. 170 CONTINUE
  166. IF (.NOT. ABS(SD2) .LE. RGAMSQ) GO TO 190
  167. IF (SD2 .EQ. ZERO) GO TO 220
  168. ASSIGN 180 TO IGO
  169. C FIX-H..
  170. GO TO 70
  171. 180 CONTINUE
  172. SD2=SD2*GAM**2
  173. SH21=SH21/GAM
  174. SH22=SH22/GAM
  175. GO TO 170
  176. 190 CONTINUE
  177. 200 CONTINUE
  178. IF (.NOT. ABS(SD2) .GE. GAMSQ) GO TO 220
  179. ASSIGN 210 TO IGO
  180. C FIX-H..
  181. GO TO 70
  182. 210 CONTINUE
  183. SD2=SD2/GAM**2
  184. SH21=SH21*GAM
  185. SH22=SH22*GAM
  186. GO TO 200
  187. 220 CONTINUE
  188. IF (SFLAG) 250,230,240
  189. 230 CONTINUE
  190. SPARAM(3)=SH21
  191. SPARAM(4)=SH12
  192. GO TO 260
  193. 240 CONTINUE
  194. SPARAM(2)=SH11
  195. SPARAM(5)=SH22
  196. GO TO 260
  197. 250 CONTINUE
  198. SPARAM(2)=SH11
  199. SPARAM(3)=SH21
  200. SPARAM(4)=SH12
  201. SPARAM(5)=SH22
  202. 260 CONTINUE
  203. SPARAM(1)=SFLAG
  204. RETURN
  205. END