dh12.f 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. *DECK DH12
  2. SUBROUTINE DH12 (MODE, LPIVOT, L1, M, U, IUE, UP, C, ICE, ICV,
  3. + NCV)
  4. C***BEGIN PROLOGUE DH12
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to DHFTI, DLSEI and DWNNLS
  7. C***LIBRARY SLATEC
  8. C***TYPE DOUBLE PRECISION (H12-S, DH12-D)
  9. C***AUTHOR (UNKNOWN)
  10. C***DESCRIPTION
  11. C
  12. C *** DOUBLE PRECISION VERSION OF H12 ******
  13. C
  14. C C.L.Lawson and R.J.Hanson, Jet Propulsion Laboratory, 1973 Jun 12
  15. C to appear in 'Solving Least Squares Problems', Prentice-Hall, 1974
  16. C
  17. C Construction and/or application of a single
  18. C Householder transformation.. Q = I + U*(U**T)/B
  19. C
  20. C MODE = 1 or 2 to select algorithm H1 or H2 .
  21. C LPIVOT is the index of the pivot element.
  22. C L1,M If L1 .LE. M the transformation will be constructed to
  23. C zero elements indexed from L1 through M. If L1 GT. M
  24. C THE SUBROUTINE DOES AN IDENTITY TRANSFORMATION.
  25. C U(),IUE,UP On entry to H1 U() contains the pivot vector.
  26. C IUE is the storage increment between elements.
  27. C On exit from H1 U() and UP
  28. C contain quantities defining the vector U of the
  29. C Householder transformation. On entry to H2 U()
  30. C and UP should contain quantities previously computed
  31. C by H1. These will not be modified by H2.
  32. C C() On entry to H1 or H2 C() contains a matrix which will be
  33. C regarded as a set of vectors to which the Householder
  34. C transformation is to be applied. On exit C() contains the
  35. C set of transformed vectors.
  36. C ICE Storage increment between elements of vectors in C().
  37. C ICV Storage increment between vectors in C().
  38. C NCV Number of vectors in C() to be transformed. If NCV .LE. 0
  39. C no operations will be done on C().
  40. C
  41. C***SEE ALSO DHFTI, DLSEI, DWNNLS
  42. C***ROUTINES CALLED DAXPY, DDOT, DSWAP
  43. C***REVISION HISTORY (YYMMDD)
  44. C 790101 DATE WRITTEN
  45. C 890531 Changed all specific intrinsics to generic. (WRB)
  46. C 890831 Modified array declarations. (WRB)
  47. C 891214 Prologue converted to Version 4.0 format. (BAB)
  48. C 900328 Added TYPE section. (WRB)
  49. C 900911 Added DDOT to DOUBLE PRECISION statement. (WRB)
  50. C***END PROLOGUE DH12
  51. INTEGER I, I2, I3, I4, ICE, ICV, INCR, IUE, J, KL1, KL2, KLP,
  52. * L1, L1M1, LPIVOT, M, MML1P2, MODE, NCV
  53. DOUBLE PRECISION B, C, CL, CLINV, ONE, UL1M1, SM, U, UP, DDOT
  54. DIMENSION U(IUE,*), C(*)
  55. C BEGIN BLOCK PERMITTING ...EXITS TO 140
  56. C***FIRST EXECUTABLE STATEMENT DH12
  57. ONE = 1.0D0
  58. C
  59. C ...EXIT
  60. IF (0 .GE. LPIVOT .OR. LPIVOT .GE. L1 .OR. L1 .GT. M) GO TO 140
  61. CL = ABS(U(1,LPIVOT))
  62. IF (MODE .EQ. 2) GO TO 40
  63. C ****** CONSTRUCT THE TRANSFORMATION. ******
  64. DO 10 J = L1, M
  65. CL = MAX(ABS(U(1,J)),CL)
  66. 10 CONTINUE
  67. IF (CL .GT. 0.0D0) GO TO 20
  68. C .........EXIT
  69. GO TO 140
  70. 20 CONTINUE
  71. CLINV = ONE/CL
  72. SM = (U(1,LPIVOT)*CLINV)**2
  73. DO 30 J = L1, M
  74. SM = SM + (U(1,J)*CLINV)**2
  75. 30 CONTINUE
  76. CL = CL*SQRT(SM)
  77. IF (U(1,LPIVOT) .GT. 0.0D0) CL = -CL
  78. UP = U(1,LPIVOT) - CL
  79. U(1,LPIVOT) = CL
  80. GO TO 50
  81. 40 CONTINUE
  82. C ****** APPLY THE TRANSFORMATION I+U*(U**T)/B TO C. ******
  83. C
  84. IF (CL .GT. 0.0D0) GO TO 50
  85. C ......EXIT
  86. GO TO 140
  87. 50 CONTINUE
  88. C ...EXIT
  89. IF (NCV .LE. 0) GO TO 140
  90. B = UP*U(1,LPIVOT)
  91. C B MUST BE NONPOSITIVE HERE. IF B = 0., RETURN.
  92. C
  93. IF (B .LT. 0.0D0) GO TO 60
  94. C ......EXIT
  95. GO TO 140
  96. 60 CONTINUE
  97. B = ONE/B
  98. MML1P2 = M - L1 + 2
  99. IF (MML1P2 .LE. 20) GO TO 80
  100. L1M1 = L1 - 1
  101. KL1 = 1 + (L1M1 - 1)*ICE
  102. KL2 = KL1
  103. KLP = 1 + (LPIVOT - 1)*ICE
  104. UL1M1 = U(1,L1M1)
  105. U(1,L1M1) = UP
  106. IF (LPIVOT .NE. L1M1) CALL DSWAP(NCV,C(KL1),ICV,C(KLP),ICV)
  107. DO 70 J = 1, NCV
  108. SM = DDOT(MML1P2,U(1,L1M1),IUE,C(KL1),ICE)
  109. SM = SM*B
  110. CALL DAXPY(MML1P2,SM,U(1,L1M1),IUE,C(KL1),ICE)
  111. KL1 = KL1 + ICV
  112. 70 CONTINUE
  113. U(1,L1M1) = UL1M1
  114. C ......EXIT
  115. IF (LPIVOT .EQ. L1M1) GO TO 140
  116. KL1 = KL2
  117. CALL DSWAP(NCV,C(KL1),ICV,C(KLP),ICV)
  118. GO TO 130
  119. 80 CONTINUE
  120. I2 = 1 - ICV + ICE*(LPIVOT - 1)
  121. INCR = ICE*(L1 - LPIVOT)
  122. DO 120 J = 1, NCV
  123. I2 = I2 + ICV
  124. I3 = I2 + INCR
  125. I4 = I3
  126. SM = C(I2)*UP
  127. DO 90 I = L1, M
  128. SM = SM + C(I3)*U(1,I)
  129. I3 = I3 + ICE
  130. 90 CONTINUE
  131. IF (SM .EQ. 0.0D0) GO TO 110
  132. SM = SM*B
  133. C(I2) = C(I2) + SM*UP
  134. DO 100 I = L1, M
  135. C(I4) = C(I4) + SM*U(1,I)
  136. I4 = I4 + ICE
  137. 100 CONTINUE
  138. 110 CONTINUE
  139. 120 CONTINUE
  140. 130 CONTINUE
  141. 140 CONTINUE
  142. RETURN
  143. END