You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

drotmgf.f 4.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. SUBROUTINE DROTMGF (DD1,DD2,DX1,DY1,DPARAM)
  2. C
  3. C CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS
  4. C THE SECOND COMPONENT OF THE 2-VECTOR (DSQRT(DD1)*DX1,DSQRT(DD2)*
  5. C DY2)**T.
  6. C WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS..
  7. C
  8. C DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0
  9. C
  10. C (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0)
  11. C H=( ) ( ) ( ) ( )
  12. C (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0).
  13. C LOCATIONS 2-4 OF DPARAM CONTAIN DH11, DH21, DH12, AND DH22
  14. C RESPECTIVELY. (VALUES OF 1.D0, -1.D0, OR 0.D0 IMPLIED BY THE
  15. C VALUE OF DPARAM(1) ARE NOT STORED IN DPARAM.)
  16. C
  17. C THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE
  18. C INEXACT. THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE
  19. C OF DD1 AND DD2. ALL ACTUAL SCALING OF DATA IS DONE USING GAM.
  20. C
  21. DOUBLE PRECISION GAM,ONE,RGAMSQ,DD2,DH11,DH21,DPARAM,DP2,
  22. 1 DQ2,DU,DY1,ZERO,GAMSQ,DD1,DFLAG,DH12,DH22,DP1,DQ1,
  23. 2 DTEMP,DX1,TWO
  24. DIMENSION DPARAM(5)
  25. C
  26. DATA ZERO,ONE,TWO /0.D0,1.D0,2.D0/
  27. DATA GAM,GAMSQ,RGAMSQ/4096.D0,16777216.D0,5.9604645D-8/
  28. IF(.NOT. DD1 .LT. ZERO) GO TO 10
  29. C GO ZERO-H-D-AND-DX1..
  30. GO TO 60
  31. 10 CONTINUE
  32. C CASE-DD1-NONNEGATIVE
  33. DP2=DD2*DY1
  34. IF(.NOT. DP2 .EQ. ZERO) GO TO 20
  35. DFLAG=-TWO
  36. GO TO 260
  37. C REGULAR-CASE..
  38. 20 CONTINUE
  39. DP1=DD1*DX1
  40. DQ2=DP2*DY1
  41. DQ1=DP1*DX1
  42. C
  43. IF(.NOT. DABS(DQ1) .GT. DABS(DQ2)) GO TO 40
  44. DH21=-DY1/DX1
  45. DH12=DP2/DP1
  46. C
  47. DU=ONE-DH12*DH21
  48. C
  49. IF(.NOT. DU .LE. ZERO) GO TO 30
  50. C GO ZERO-H-D-AND-DX1..
  51. GO TO 60
  52. 30 CONTINUE
  53. DFLAG=ZERO
  54. DD1=DD1/DU
  55. DD2=DD2/DU
  56. DX1=DX1*DU
  57. C GO SCALE-CHECK..
  58. GO TO 100
  59. 40 CONTINUE
  60. IF(.NOT. DQ2 .LT. ZERO) GO TO 50
  61. C GO ZERO-H-D-AND-DX1..
  62. GO TO 60
  63. 50 CONTINUE
  64. DFLAG=ONE
  65. DH11=DP1/DP2
  66. DH22=DX1/DY1
  67. DU=ONE+DH11*DH22
  68. DTEMP=DD2/DU
  69. DD2=DD1/DU
  70. DD1=DTEMP
  71. DX1=DY1*DU
  72. C GO SCALE-CHECK
  73. GO TO 100
  74. C PROCEDURE..ZERO-H-D-AND-DX1..
  75. 60 CONTINUE
  76. DFLAG=-ONE
  77. DH11=ZERO
  78. DH12=ZERO
  79. DH21=ZERO
  80. DH22=ZERO
  81. C
  82. DD1=ZERO
  83. DD2=ZERO
  84. DX1=ZERO
  85. C RETURN..
  86. GO TO 220
  87. C PROCEDURE..FIX-H..
  88. 70 CONTINUE
  89. IF(.NOT. DFLAG .GE. ZERO) GO TO 90
  90. C
  91. IF(.NOT. DFLAG .EQ. ZERO) GO TO 80
  92. DH11=ONE
  93. DH22=ONE
  94. DFLAG=-ONE
  95. GO TO 90
  96. 80 CONTINUE
  97. DH21=-ONE
  98. DH12=ONE
  99. DFLAG=-ONE
  100. 90 CONTINUE
  101. GO TO IGO,(120,150,180,210)
  102. C PROCEDURE..SCALE-CHECK
  103. 100 CONTINUE
  104. 110 CONTINUE
  105. IF(.NOT. DD1 .LE. RGAMSQ) GO TO 130
  106. IF(DD1 .EQ. ZERO) GO TO 160
  107. ASSIGN 120 TO IGO
  108. C FIX-H..
  109. GO TO 70
  110. 120 CONTINUE
  111. DD1=DD1*GAM**2
  112. DX1=DX1/GAM
  113. DH11=DH11/GAM
  114. DH12=DH12/GAM
  115. GO TO 110
  116. 130 CONTINUE
  117. 140 CONTINUE
  118. IF(.NOT. DD1 .GE. GAMSQ) GO TO 160
  119. ASSIGN 150 TO IGO
  120. C FIX-H..
  121. GO TO 70
  122. 150 CONTINUE
  123. DD1=DD1/GAM**2
  124. DX1=DX1*GAM
  125. DH11=DH11*GAM
  126. DH12=DH12*GAM
  127. GO TO 140
  128. 160 CONTINUE
  129. 170 CONTINUE
  130. IF(.NOT. DABS(DD2) .LE. RGAMSQ) GO TO 190
  131. IF(DD2 .EQ. ZERO) GO TO 220
  132. ASSIGN 180 TO IGO
  133. C FIX-H..
  134. GO TO 70
  135. 180 CONTINUE
  136. DD2=DD2*GAM**2
  137. DH21=DH21/GAM
  138. DH22=DH22/GAM
  139. GO TO 170
  140. 190 CONTINUE
  141. 200 CONTINUE
  142. IF(.NOT. DABS(DD2) .GE. GAMSQ) GO TO 220
  143. ASSIGN 210 TO IGO
  144. C FIX-H..
  145. GO TO 70
  146. 210 CONTINUE
  147. DD2=DD2/GAM**2
  148. DH21=DH21*GAM
  149. DH22=DH22*GAM
  150. GO TO 200
  151. 220 CONTINUE
  152. IF(DFLAG)250,230,240
  153. 230 CONTINUE
  154. DPARAM(3)=DH21
  155. DPARAM(4)=DH12
  156. GO TO 260
  157. 240 CONTINUE
  158. DPARAM(2)=DH11
  159. DPARAM(5)=DH22
  160. GO TO 260
  161. 250 CONTINUE
  162. DPARAM(2)=DH11
  163. DPARAM(3)=DH21
  164. DPARAM(4)=DH12
  165. DPARAM(5)=DH22
  166. 260 CONTINUE
  167. DPARAM(1)=DFLAG
  168. RETURN
  169. END