dorthr.f 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. *DECK DORTHR
  2. SUBROUTINE DORTHR (A, N, M, NRDA, IFLAG, IRANK, ISCALE, DIAG,
  3. + KPIVOT, SCALES, ROWS, RS)
  4. C***BEGIN PROLOGUE DORTHR
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to DBVSUP and DSUDS
  7. C***LIBRARY SLATEC
  8. C***TYPE DOUBLE PRECISION (ORTHOR-S, DORTHR-D)
  9. C***AUTHOR Watts, H. A., (SNLA)
  10. C***DESCRIPTION
  11. C
  12. C Reduction of the matrix A to lower triangular form by a sequence of
  13. C orthogonal HOUSEHOLDER transformations post-multiplying A.
  14. C
  15. C *********************************************************************
  16. C INPUT
  17. C *********************************************************************
  18. C
  19. C A -- Contains the matrix to be decomposed, must be dimensioned
  20. C NRDA by N.
  21. C N -- Number of rows in the matrix, N greater or equal to 1.
  22. C M -- Number of columns in the matrix, M greater or equal to N.
  23. C IFLAG -- Indicates the uncertainty in the matrix data.
  24. C = 0 when the data is to be treated as exact.
  25. C =-K when the data is assumed to be accurate to about
  26. C K digits.
  27. C ISCALE -- Scaling indicator.
  28. C =-1 if the matrix is to be pre-scaled by
  29. C columns when appropriate.
  30. C Otherwise no scaling will be attempted.
  31. C NRDA -- Row dimension of A, NRDA greater or equal to N.
  32. C DIAG,KPIVOT,ROWS, -- Arrays of length at least N used internally
  33. C RS,SCALES (except for SCALES which is M).
  34. C
  35. C *********************************************************************
  36. C OUTPUT
  37. C *********************************************************************
  38. C
  39. C IFLAG - Status indicator
  40. C =1 for successful decomposition.
  41. C =2 if improper input is detected.
  42. C =3 if rank of the matrix is less than N.
  43. C A -- Contains the reduced matrix in the strictly lower triangular
  44. C part and transformation information.
  45. C IRANK -- Contains the numerically determined matrix rank.
  46. C DIAG -- Contains the diagonal elements of the reduced
  47. C triangular matrix.
  48. C KPIVOT -- Contains the pivotal information, the column
  49. C interchanges performed on the original matrix are
  50. C recorded here.
  51. C SCALES -- Contains the column scaling parameters.
  52. C
  53. C *********************************************************************
  54. C
  55. C***SEE ALSO DBVSUP, DSUDS
  56. C***REFERENCES G. Golub, Numerical methods for solving linear least
  57. C squares problems, Numerische Mathematik 7, (1965),
  58. C pp. 206-216.
  59. C P. Businger and G. Golub, Linear least squares
  60. C solutions by Householder transformations, Numerische
  61. C Mathematik 7, (1965), pp. 269-276.
  62. C***ROUTINES CALLED D1MACH, DCSCAL, DDOT, XERMSG
  63. C***REVISION HISTORY (YYMMDD)
  64. C 750601 DATE WRITTEN
  65. C 890531 Changed all specific intrinsics to generic. (WRB)
  66. C 891214 Prologue converted to Version 4.0 format. (BAB)
  67. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  68. C 900328 Added TYPE section. (WRB)
  69. C 910408 Updated the AUTHOR and REFERENCES sections. (WRB)
  70. C 920501 Reformatted the REFERENCES section. (WRB)
  71. C***END PROLOGUE DORTHR
  72. DOUBLE PRECISION DDOT, D1MACH
  73. INTEGER IFLAG, IRANK, ISCALE, J, JROW, K, KP, KPIVOT(*), L, M,
  74. 1 MK, N, NRDA
  75. DOUBLE PRECISION A(NRDA,*), ACC, AKK, ANORM, AS, ASAVE, DIAG(*),
  76. 1 DIAGK, DUM, ROWS(*), RS(*), RSS, SAD, SCALES(*), SIG, SIGMA,
  77. 2 SRURO, URO
  78. C
  79. C ******************************************************************
  80. C
  81. C MACHINE PRECISION (COMPUTER UNIT ROUNDOFF VALUE) IS DEFINED
  82. C BY THE FUNCTION D1MACH.
  83. C
  84. C ******************************************************************
  85. C
  86. C***FIRST EXECUTABLE STATEMENT DORTHR
  87. URO = D1MACH(4)
  88. IF (M .GE. N .AND. N .GE. 1 .AND. NRDA .GE. N) GO TO 10
  89. IFLAG = 2
  90. CALL XERMSG ('SLATEC', 'DORTHR', 'INVALID INPUT PARAMETERS.',
  91. + 2, 1)
  92. GO TO 150
  93. 10 CONTINUE
  94. C
  95. ACC = 10.0D0*URO
  96. IF (IFLAG .LT. 0) ACC = MAX(ACC,10.0D0**IFLAG)
  97. SRURO = SQRT(URO)
  98. IFLAG = 1
  99. IRANK = N
  100. C
  101. C COMPUTE NORM**2 OF JTH ROW AND A MATRIX NORM
  102. C
  103. ANORM = 0.0D0
  104. DO 20 J = 1, N
  105. KPIVOT(J) = J
  106. ROWS(J) = DDOT(M,A(J,1),NRDA,A(J,1),NRDA)
  107. RS(J) = ROWS(J)
  108. ANORM = ANORM + ROWS(J)
  109. 20 CONTINUE
  110. C
  111. C PERFORM COLUMN SCALING ON A WHEN SPECIFIED
  112. C
  113. CALL DCSCAL(A,NRDA,N,M,SCALES,DUM,ROWS,RS,ANORM,SCALES,ISCALE,
  114. 1 1)
  115. C
  116. ANORM = SQRT(ANORM)
  117. C
  118. C
  119. C CONSTRUCTION OF LOWER TRIANGULAR MATRIX AND RECORDING OF
  120. C ORTHOGONAL TRANSFORMATIONS
  121. C
  122. C
  123. DO 130 K = 1, N
  124. C BEGIN BLOCK PERMITTING ...EXITS TO 80
  125. MK = M - K + 1
  126. C ...EXIT
  127. IF (K .EQ. N) GO TO 80
  128. KP = K + 1
  129. C
  130. C SEARCHING FOR PIVOTAL ROW
  131. C
  132. DO 60 J = K, N
  133. C BEGIN BLOCK PERMITTING ...EXITS TO 50
  134. IF (ROWS(J) .GE. SRURO*RS(J)) GO TO 30
  135. ROWS(J) = DDOT(MK,A(J,K),NRDA,A(J,K),NRDA)
  136. RS(J) = ROWS(J)
  137. 30 CONTINUE
  138. IF (J .EQ. K) GO TO 40
  139. C ......EXIT
  140. IF (SIGMA .GE. 0.99D0*ROWS(J)) GO TO 50
  141. 40 CONTINUE
  142. SIGMA = ROWS(J)
  143. JROW = J
  144. 50 CONTINUE
  145. 60 CONTINUE
  146. C ...EXIT
  147. IF (JROW .EQ. K) GO TO 80
  148. C
  149. C PERFORM ROW INTERCHANGE
  150. C
  151. L = KPIVOT(K)
  152. KPIVOT(K) = KPIVOT(JROW)
  153. KPIVOT(JROW) = L
  154. ROWS(JROW) = ROWS(K)
  155. ROWS(K) = SIGMA
  156. RSS = RS(K)
  157. RS(K) = RS(JROW)
  158. RS(JROW) = RSS
  159. DO 70 L = 1, M
  160. ASAVE = A(K,L)
  161. A(K,L) = A(JROW,L)
  162. A(JROW,L) = ASAVE
  163. 70 CONTINUE
  164. 80 CONTINUE
  165. C
  166. C CHECK RANK OF THE MATRIX
  167. C
  168. SIG = DDOT(MK,A(K,K),NRDA,A(K,K),NRDA)
  169. DIAGK = SQRT(SIG)
  170. IF (DIAGK .GT. ACC*ANORM) GO TO 90
  171. C
  172. C RANK DEFICIENT PROBLEM
  173. IFLAG = 3
  174. IRANK = K - 1
  175. CALL XERMSG ('SLATEC', 'DORTHR',
  176. + 'RANK OF MATRIX IS LESS THAN THE NUMBER OF ROWS.', 1,
  177. + 1)
  178. C ......EXIT
  179. GO TO 140
  180. 90 CONTINUE
  181. C
  182. C CONSTRUCT AND APPLY TRANSFORMATION TO MATRIX A
  183. C
  184. AKK = A(K,K)
  185. IF (AKK .GT. 0.0D0) DIAGK = -DIAGK
  186. DIAG(K) = DIAGK
  187. A(K,K) = AKK - DIAGK
  188. IF (K .EQ. N) GO TO 120
  189. SAD = DIAGK*AKK - SIG
  190. DO 110 J = KP, N
  191. AS = DDOT(MK,A(K,K),NRDA,A(J,K),NRDA)/SAD
  192. DO 100 L = K, M
  193. A(J,L) = A(J,L) + AS*A(K,L)
  194. 100 CONTINUE
  195. ROWS(J) = ROWS(J) - A(J,K)**2
  196. 110 CONTINUE
  197. 120 CONTINUE
  198. 130 CONTINUE
  199. 140 CONTINUE
  200. 150 CONTINUE
  201. C
  202. C
  203. RETURN
  204. END