d1updt.f 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. *DECK D1UPDT
  2. SUBROUTINE D1UPDT (M, N, S, LS, U, V, W, SING)
  3. C***BEGIN PROLOGUE D1UPDT
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to DNSQ and DNSQE
  6. C***LIBRARY SLATEC
  7. C***TYPE DOUBLE PRECISION (R1UPDT-S, D1UPDT-D)
  8. C***AUTHOR (UNKNOWN)
  9. C***DESCRIPTION
  10. C
  11. C Given an M by N lower trapezoidal matrix S, an M-vector U,
  12. C and an N-vector V, the problem is to determine an
  13. C orthogonal matrix Q such that
  14. C
  15. C t
  16. C (S + U*V )*Q
  17. C
  18. C is again lower trapezoidal.
  19. C
  20. C This subroutine determines Q as the product of 2*(N - 1)
  21. C transformations
  22. C
  23. C GV(N-1)*...*GV(1)*GW(1)*...*GW(N-1)
  24. C
  25. C where GV(I), GW(I) are Givens rotations in the (I,N) plane
  26. C which eliminate elements in the I-th and N-th planes,
  27. C respectively. Q itself is not accumulated, rather the
  28. C information to recover the GV, GW rotations is returned.
  29. C
  30. C The SUBROUTINE statement is
  31. C
  32. C SUBROUTINE D1UPDT(M,N,S,LS,U,V,W,SING)
  33. C
  34. C where
  35. C
  36. C M is a positive integer input variable set to the number
  37. C of rows of S.
  38. C
  39. C N is a positive integer input variable set to the number
  40. C of columns of S. N must not exceed M.
  41. C
  42. C S is an array of length LS. On input S must contain the lower
  43. C trapezoidal matrix S stored by columns. On output S contains
  44. C the lower trapezoidal matrix produced as described above.
  45. C
  46. C LS is a positive integer input variable not less than
  47. C (N*(2*M-N+1))/2.
  48. C
  49. C U is an input array of length M which must contain the
  50. C vector U.
  51. C
  52. C V is an array of length N. On input V must contain the vector
  53. C V. On output V(I) contains the information necessary to
  54. C recover the Givens rotation GV(I) described above.
  55. C
  56. C W is an output array of length M. W(I) contains information
  57. C necessary to recover the Givens rotation GW(I) described
  58. C above.
  59. C
  60. C SING is a LOGICAL output variable. SING is set TRUE if any
  61. C of the diagonal elements of the output S are zero. Otherwise
  62. C SING is set FALSE.
  63. C
  64. C***SEE ALSO DNSQ, DNSQE
  65. C***ROUTINES CALLED D1MACH
  66. C***REVISION HISTORY (YYMMDD)
  67. C 800301 DATE WRITTEN
  68. C 890531 Changed all specific intrinsics to generic. (WRB)
  69. C 890831 Modified array declarations. (WRB)
  70. C 891214 Prologue converted to Version 4.0 format. (BAB)
  71. C 900326 Removed duplicate information from DESCRIPTION section.
  72. C (WRB)
  73. C 900328 Added TYPE section. (WRB)
  74. C***END PROLOGUE D1UPDT
  75. DOUBLE PRECISION D1MACH
  76. INTEGER I, J, JJ, L, LS, M, N, NM1, NMJ
  77. DOUBLE PRECISION COS, COTAN, GIANT, ONE, P25, P5, S(*),
  78. 1 SIN, TAN, TAU, TEMP, U(*), V(*), W(*), ZERO
  79. LOGICAL SING
  80. SAVE ONE, P5, P25, ZERO
  81. DATA ONE,P5,P25,ZERO /1.0D0,5.0D-1,2.5D-1,0.0D0/
  82. C
  83. C GIANT IS THE LARGEST MAGNITUDE.
  84. C
  85. C***FIRST EXECUTABLE STATEMENT D1UPDT
  86. GIANT = D1MACH(2)
  87. C
  88. C INITIALIZE THE DIAGONAL ELEMENT POINTER.
  89. C
  90. JJ = (N*(2*M - N + 1))/2 - (M - N)
  91. C
  92. C MOVE THE NONTRIVIAL PART OF THE LAST COLUMN OF S INTO W.
  93. C
  94. L = JJ
  95. DO 10 I = N, M
  96. W(I) = S(L)
  97. L = L + 1
  98. 10 CONTINUE
  99. C
  100. C ROTATE THE VECTOR V INTO A MULTIPLE OF THE N-TH UNIT VECTOR
  101. C IN SUCH A WAY THAT A SPIKE IS INTRODUCED INTO W.
  102. C
  103. NM1 = N - 1
  104. IF (NM1 .LT. 1) GO TO 70
  105. DO 60 NMJ = 1, NM1
  106. J = N - NMJ
  107. JJ = JJ - (M - J + 1)
  108. W(J) = ZERO
  109. IF (V(J) .EQ. ZERO) GO TO 50
  110. C
  111. C DETERMINE A GIVENS ROTATION WHICH ELIMINATES THE
  112. C J-TH ELEMENT OF V.
  113. C
  114. IF (ABS(V(N)) .GE. ABS(V(J))) GO TO 20
  115. COTAN = V(N)/V(J)
  116. SIN = P5/SQRT(P25+P25*COTAN**2)
  117. COS = SIN*COTAN
  118. TAU = ONE
  119. IF (ABS(COS)*GIANT .GT. ONE) TAU = ONE/COS
  120. GO TO 30
  121. 20 CONTINUE
  122. TAN = V(J)/V(N)
  123. COS = P5/SQRT(P25+P25*TAN**2)
  124. SIN = COS*TAN
  125. TAU = SIN
  126. 30 CONTINUE
  127. C
  128. C APPLY THE TRANSFORMATION TO V AND STORE THE INFORMATION
  129. C NECESSARY TO RECOVER THE GIVENS ROTATION.
  130. C
  131. V(N) = SIN*V(J) + COS*V(N)
  132. V(J) = TAU
  133. C
  134. C APPLY THE TRANSFORMATION TO S AND EXTEND THE SPIKE IN W.
  135. C
  136. L = JJ
  137. DO 40 I = J, M
  138. TEMP = COS*S(L) - SIN*W(I)
  139. W(I) = SIN*S(L) + COS*W(I)
  140. S(L) = TEMP
  141. L = L + 1
  142. 40 CONTINUE
  143. 50 CONTINUE
  144. 60 CONTINUE
  145. 70 CONTINUE
  146. C
  147. C ADD THE SPIKE FROM THE RANK 1 UPDATE TO W.
  148. C
  149. DO 80 I = 1, M
  150. W(I) = W(I) + V(N)*U(I)
  151. 80 CONTINUE
  152. C
  153. C ELIMINATE THE SPIKE.
  154. C
  155. SING = .FALSE.
  156. IF (NM1 .LT. 1) GO TO 140
  157. DO 130 J = 1, NM1
  158. IF (W(J) .EQ. ZERO) GO TO 120
  159. C
  160. C DETERMINE A GIVENS ROTATION WHICH ELIMINATES THE
  161. C J-TH ELEMENT OF THE SPIKE.
  162. C
  163. IF (ABS(S(JJ)) .GE. ABS(W(J))) GO TO 90
  164. COTAN = S(JJ)/W(J)
  165. SIN = P5/SQRT(P25+P25*COTAN**2)
  166. COS = SIN*COTAN
  167. TAU = ONE
  168. IF (ABS(COS)*GIANT .GT. ONE) TAU = ONE/COS
  169. GO TO 100
  170. 90 CONTINUE
  171. TAN = W(J)/S(JJ)
  172. COS = P5/SQRT(P25+P25*TAN**2)
  173. SIN = COS*TAN
  174. TAU = SIN
  175. 100 CONTINUE
  176. C
  177. C APPLY THE TRANSFORMATION TO S AND REDUCE THE SPIKE IN W.
  178. C
  179. L = JJ
  180. DO 110 I = J, M
  181. TEMP = COS*S(L) + SIN*W(I)
  182. W(I) = -SIN*S(L) + COS*W(I)
  183. S(L) = TEMP
  184. L = L + 1
  185. 110 CONTINUE
  186. C
  187. C STORE THE INFORMATION NECESSARY TO RECOVER THE
  188. C GIVENS ROTATION.
  189. C
  190. W(J) = TAU
  191. 120 CONTINUE
  192. C
  193. C TEST FOR ZERO DIAGONAL ELEMENTS IN THE OUTPUT S.
  194. C
  195. IF (S(JJ) .EQ. ZERO) SING = .TRUE.
  196. JJ = JJ + (M - J + 1)
  197. 130 CONTINUE
  198. 140 CONTINUE
  199. C
  200. C MOVE W BACK INTO THE LAST COLUMN OF THE OUTPUT S.
  201. C
  202. L = JJ
  203. DO 150 I = N, M
  204. S(L) = W(I)
  205. L = L + 1
  206. 150 CONTINUE
  207. IF (S(JJ) .EQ. ZERO) SING = .TRUE.
  208. RETURN
  209. C
  210. C LAST CARD OF SUBROUTINE D1UPDT.
  211. C
  212. END