drotm.f 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. *DECK DROTM
  2. SUBROUTINE DROTM (N, DX, INCX, DY, INCY, DPARAM)
  3. C***BEGIN PROLOGUE DROTM
  4. C***PURPOSE Apply a modified Givens transformation.
  5. C***LIBRARY SLATEC (BLAS)
  6. C***CATEGORY D1A8
  7. C***TYPE DOUBLE PRECISION (SROTM-S, DROTM-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 N number of elements in input vector(s)
  20. C DX double precision vector with N elements
  21. C INCX storage spacing between elements of DX
  22. C DY double precision vector with N elements
  23. C INCY storage spacing between elements of DY
  24. C DPARAM 5-element D.P. vector. DPARAM(1) is DFLAG described below.
  25. C Locations 2-5 of SPARAM contain elements of the
  26. C transformation matrix H described below.
  27. C
  28. C --Output--
  29. C DX rotated vector (unchanged if N .LE. 0)
  30. C DY rotated vector (unchanged if N .LE. 0)
  31. C
  32. C Apply the modified Givens transformation, H, to the 2 by N matrix
  33. C (DX**T)
  34. C (DY**T) , where **T indicates transpose. The elements of DX are
  35. C in DX(LX+I*INCX), I = 0 to N-1, where LX = 1 if INCX .GE. 0, else
  36. C LX = 1+(1-N)*INCX, and similarly for DY using LY and INCY.
  37. C
  38. C With DPARAM(1)=DFLAG, H has one of the following forms:
  39. C
  40. C DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0
  41. C
  42. C (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0)
  43. C H=( ) ( ) ( ) ( )
  44. C (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0).
  45. C
  46. C See DROTMG for a description of data storage in DPARAM.
  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 861211 REVISION DATE from Version 3.2
  56. C 891214 Prologue converted to Version 4.0 format. (BAB)
  57. C 920310 Corrected definition of LX in DESCRIPTION. (WRB)
  58. C 920501 Reformatted the REFERENCES section. (WRB)
  59. C***END PROLOGUE DROTM
  60. DOUBLE PRECISION DFLAG, DH12, DH22, DX, TWO, Z, DH11, DH21,
  61. 1 DPARAM, DY, W, ZERO
  62. DIMENSION DX(*), DY(*), DPARAM(5)
  63. SAVE ZERO, TWO
  64. DATA ZERO, TWO /0.0D0, 2.0D0/
  65. C***FIRST EXECUTABLE STATEMENT DROTM
  66. DFLAG=DPARAM(1)
  67. IF (N.LE.0 .OR. (DFLAG+TWO.EQ.ZERO)) GO TO 140
  68. IF (.NOT.(INCX.EQ.INCY.AND. INCX .GT.0)) GO TO 70
  69. C
  70. NSTEPS=N*INCX
  71. IF (DFLAG) 50,10,30
  72. 10 CONTINUE
  73. DH12=DPARAM(4)
  74. DH21=DPARAM(3)
  75. DO 20 I = 1,NSTEPS,INCX
  76. W=DX(I)
  77. Z=DY(I)
  78. DX(I)=W+Z*DH12
  79. DY(I)=W*DH21+Z
  80. 20 CONTINUE
  81. GO TO 140
  82. 30 CONTINUE
  83. DH11=DPARAM(2)
  84. DH22=DPARAM(5)
  85. DO 40 I = 1,NSTEPS,INCX
  86. W=DX(I)
  87. Z=DY(I)
  88. DX(I)=W*DH11+Z
  89. DY(I)=-W+DH22*Z
  90. 40 CONTINUE
  91. GO TO 140
  92. 50 CONTINUE
  93. DH11=DPARAM(2)
  94. DH12=DPARAM(4)
  95. DH21=DPARAM(3)
  96. DH22=DPARAM(5)
  97. DO 60 I = 1,NSTEPS,INCX
  98. W=DX(I)
  99. Z=DY(I)
  100. DX(I)=W*DH11+Z*DH12
  101. DY(I)=W*DH21+Z*DH22
  102. 60 CONTINUE
  103. GO TO 140
  104. 70 CONTINUE
  105. KX=1
  106. KY=1
  107. IF (INCX .LT. 0) KX = 1+(1-N)*INCX
  108. IF (INCY .LT. 0) KY = 1+(1-N)*INCY
  109. C
  110. IF (DFLAG) 120,80,100
  111. 80 CONTINUE
  112. DH12=DPARAM(4)
  113. DH21=DPARAM(3)
  114. DO 90 I = 1,N
  115. W=DX(KX)
  116. Z=DY(KY)
  117. DX(KX)=W+Z*DH12
  118. DY(KY)=W*DH21+Z
  119. KX=KX+INCX
  120. KY=KY+INCY
  121. 90 CONTINUE
  122. GO TO 140
  123. 100 CONTINUE
  124. DH11=DPARAM(2)
  125. DH22=DPARAM(5)
  126. DO 110 I = 1,N
  127. W=DX(KX)
  128. Z=DY(KY)
  129. DX(KX)=W*DH11+Z
  130. DY(KY)=-W+DH22*Z
  131. KX=KX+INCX
  132. KY=KY+INCY
  133. 110 CONTINUE
  134. GO TO 140
  135. 120 CONTINUE
  136. DH11=DPARAM(2)
  137. DH12=DPARAM(4)
  138. DH21=DPARAM(3)
  139. DH22=DPARAM(5)
  140. DO 130 I = 1,N
  141. W=DX(KX)
  142. Z=DY(KY)
  143. DX(KX)=W*DH11+Z*DH12
  144. DY(KY)=W*DH21+Z*DH22
  145. KX=KX+INCX
  146. KY=KY+INCY
  147. 130 CONTINUE
  148. 140 CONTINUE
  149. RETURN
  150. END