drotmg.f 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. *DECK DROTMG
  2. SUBROUTINE DROTMG (DD1, DD2, DX1, DY1, DPARAM)
  3. C***BEGIN PROLOGUE DROTMG
  4. C***PURPOSE Construct a modified Givens transformation.
  5. C***LIBRARY SLATEC (BLAS)
  6. C***CATEGORY D1B10
  7. C***TYPE DOUBLE 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 DD1 double precision scalar
  20. C DD2 double precision scalar
  21. C DX1 double precision scalar
  22. C DX2 double precision scalar
  23. C DPARAM D.P. 5-vector. DPARAM(1)=DFLAG defined below.
  24. C Locations 2-5 contain the rotation matrix.
  25. C
  26. C --Output--
  27. C DD1 changed to represent the effect of the transformation
  28. C DD2 changed to represent the effect of the transformation
  29. C DX1 changed to represent the effect of the transformation
  30. C DX2 unchanged
  31. C
  32. C Construct the modified Givens transformation matrix H which zeros
  33. C the second component of the 2-vector (SQRT(DD1)*DX1,SQRT(DD2)*
  34. C DY2)**T.
  35. C With DPARAM(1)=DFLAG, H has one of the following forms:
  36. C
  37. C DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0
  38. C
  39. C (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0)
  40. C H=( ) ( ) ( ) ( )
  41. C (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0).
  42. C
  43. C Locations 2-5 of DPARAM contain DH11, DH21, DH12, and DH22,
  44. C respectively. (Values of 1.D0, -1.D0, or 0.D0 implied by the
  45. C value of DPARAM(1) are not stored in DPARAM.)
  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 890531 Changed all specific intrinsics to generic. (WRB)
  55. C 890531 REVISION DATE from Version 3.2
  56. C 891214 Prologue converted to Version 4.0 format. (BAB)
  57. C 920316 Prologue corrected. (WRB)
  58. C 920501 Reformatted the REFERENCES section. (WRB)
  59. C***END PROLOGUE DROTMG
  60. DOUBLE PRECISION GAM, ONE, RGAMSQ, DD1, DD2, DH11, DH12, DH21,
  61. 1 DH22, DPARAM, DP1, DP2, DQ1, DQ2, DU, DY1, ZERO,
  62. 2 GAMSQ, DFLAG, DTEMP, DX1, TWO
  63. DIMENSION DPARAM(5)
  64. SAVE ZERO, ONE, TWO, GAM, GAMSQ, RGAMSQ
  65. DATA ZERO, ONE, TWO /0.0D0, 1.0D0, 2.0D0/
  66. DATA GAM, GAMSQ, RGAMSQ /4096.0D0, 16777216.D0, 5.9604645D-8/
  67. C***FIRST EXECUTABLE STATEMENT DROTMG
  68. IF (.NOT. DD1 .LT. ZERO) GO TO 10
  69. C GO ZERO-H-D-AND-DX1..
  70. GO TO 60
  71. 10 CONTINUE
  72. C CASE-DD1-NONNEGATIVE
  73. DP2=DD2*DY1
  74. IF (.NOT. DP2 .EQ. ZERO) GO TO 20
  75. DFLAG=-TWO
  76. GO TO 260
  77. C REGULAR-CASE..
  78. 20 CONTINUE
  79. DP1=DD1*DX1
  80. DQ2=DP2*DY1
  81. DQ1=DP1*DX1
  82. C
  83. IF (.NOT. ABS(DQ1) .GT. ABS(DQ2)) GO TO 40
  84. DH21=-DY1/DX1
  85. DH12=DP2/DP1
  86. C
  87. DU=ONE-DH12*DH21
  88. C
  89. IF (.NOT. DU .LE. ZERO) GO TO 30
  90. C GO ZERO-H-D-AND-DX1..
  91. GO TO 60
  92. 30 CONTINUE
  93. DFLAG=ZERO
  94. DD1=DD1/DU
  95. DD2=DD2/DU
  96. DX1=DX1*DU
  97. C GO SCALE-CHECK..
  98. GO TO 100
  99. 40 CONTINUE
  100. IF (.NOT. DQ2 .LT. ZERO) GO TO 50
  101. C GO ZERO-H-D-AND-DX1..
  102. GO TO 60
  103. 50 CONTINUE
  104. DFLAG=ONE
  105. DH11=DP1/DP2
  106. DH22=DX1/DY1
  107. DU=ONE+DH11*DH22
  108. DTEMP=DD2/DU
  109. DD2=DD1/DU
  110. DD1=DTEMP
  111. DX1=DY1*DU
  112. C GO SCALE-CHECK
  113. GO TO 100
  114. C PROCEDURE..ZERO-H-D-AND-DX1..
  115. 60 CONTINUE
  116. DFLAG=-ONE
  117. DH11=ZERO
  118. DH12=ZERO
  119. DH21=ZERO
  120. DH22=ZERO
  121. C
  122. DD1=ZERO
  123. DD2=ZERO
  124. DX1=ZERO
  125. C RETURN..
  126. GO TO 220
  127. C PROCEDURE..FIX-H..
  128. 70 CONTINUE
  129. IF (.NOT. DFLAG .GE. ZERO) GO TO 90
  130. C
  131. IF (.NOT. DFLAG .EQ. ZERO) GO TO 80
  132. DH11=ONE
  133. DH22=ONE
  134. DFLAG=-ONE
  135. GO TO 90
  136. 80 CONTINUE
  137. DH21=-ONE
  138. DH12=ONE
  139. DFLAG=-ONE
  140. 90 CONTINUE
  141. GO TO IGO,(120,150,180,210)
  142. C PROCEDURE..SCALE-CHECK
  143. 100 CONTINUE
  144. 110 CONTINUE
  145. IF (.NOT. DD1 .LE. RGAMSQ) GO TO 130
  146. IF (DD1 .EQ. ZERO) GO TO 160
  147. ASSIGN 120 TO IGO
  148. C FIX-H..
  149. GO TO 70
  150. 120 CONTINUE
  151. DD1=DD1*GAM**2
  152. DX1=DX1/GAM
  153. DH11=DH11/GAM
  154. DH12=DH12/GAM
  155. GO TO 110
  156. 130 CONTINUE
  157. 140 CONTINUE
  158. IF (.NOT. DD1 .GE. GAMSQ) GO TO 160
  159. ASSIGN 150 TO IGO
  160. C FIX-H..
  161. GO TO 70
  162. 150 CONTINUE
  163. DD1=DD1/GAM**2
  164. DX1=DX1*GAM
  165. DH11=DH11*GAM
  166. DH12=DH12*GAM
  167. GO TO 140
  168. 160 CONTINUE
  169. 170 CONTINUE
  170. IF (.NOT. ABS(DD2) .LE. RGAMSQ) GO TO 190
  171. IF (DD2 .EQ. ZERO) GO TO 220
  172. ASSIGN 180 TO IGO
  173. C FIX-H..
  174. GO TO 70
  175. 180 CONTINUE
  176. DD2=DD2*GAM**2
  177. DH21=DH21/GAM
  178. DH22=DH22/GAM
  179. GO TO 170
  180. 190 CONTINUE
  181. 200 CONTINUE
  182. IF (.NOT. ABS(DD2) .GE. GAMSQ) GO TO 220
  183. ASSIGN 210 TO IGO
  184. C FIX-H..
  185. GO TO 70
  186. 210 CONTINUE
  187. DD2=DD2/GAM**2
  188. DH21=DH21*GAM
  189. DH22=DH22*GAM
  190. GO TO 200
  191. 220 CONTINUE
  192. IF (DFLAG) 250,230,240
  193. 230 CONTINUE
  194. DPARAM(3)=DH21
  195. DPARAM(4)=DH12
  196. GO TO 260
  197. 240 CONTINUE
  198. DPARAM(2)=DH11
  199. DPARAM(5)=DH22
  200. GO TO 260
  201. 250 CONTINUE
  202. DPARAM(2)=DH11
  203. DPARAM(3)=DH21
  204. DPARAM(4)=DH12
  205. DPARAM(5)=DH22
  206. 260 CONTINUE
  207. DPARAM(1)=DFLAG
  208. RETURN
  209. END