du12ls.f 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. *DECK DU12LS
  2. SUBROUTINE DU12LS (A, MDA, M, N, B, MDB, NB, MODE, KRANK, RNORM,
  3. + H, W, IC, IR)
  4. C***BEGIN PROLOGUE DU12LS
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to DLLSIA
  7. C***LIBRARY SLATEC
  8. C***TYPE DOUBLE PRECISION (U12LS-S, DU12LS-D)
  9. C***AUTHOR (UNKNOWN)
  10. C***DESCRIPTION
  11. C
  12. C Given the Householder QR factorization of A, this
  13. C subroutine solves the system AX=B. If the system
  14. C is of reduced rank, this routine returns a solution
  15. C according to the selected mode.
  16. C
  17. C Note - If MODE.NE.2, W is never accessed.
  18. C
  19. C***SEE ALSO DLLSIA
  20. C***ROUTINES CALLED DAXPY, DDOT, DNRM2, DSWAP
  21. C***REVISION HISTORY (YYMMDD)
  22. C 810801 DATE WRITTEN
  23. C 890531 Changed all specific intrinsics to generic. (WRB)
  24. C 890831 Modified array declarations. (WRB)
  25. C 891214 Prologue converted to Version 4.0 format. (BAB)
  26. C 900328 Added TYPE section. (WRB)
  27. C***END PROLOGUE DU12LS
  28. IMPLICIT DOUBLE PRECISION (A-H,O-Z)
  29. DOUBLE PRECISION DDOT,DNRM2
  30. DIMENSION A(MDA,*),B(MDB,*),RNORM(*),H(*),W(*)
  31. INTEGER IC(*),IR(*)
  32. C***FIRST EXECUTABLE STATEMENT DU12LS
  33. K=KRANK
  34. KP1=K+1
  35. C
  36. C RANK=0
  37. C
  38. IF(K.GT.0) GO TO 410
  39. DO 404 JB=1,NB
  40. RNORM(JB)=DNRM2(M,B(1,JB),1)
  41. 404 CONTINUE
  42. DO 406 JB=1,NB
  43. DO 406 I=1,N
  44. B(I,JB)=0.0D0
  45. 406 CONTINUE
  46. RETURN
  47. C
  48. C REORDER B TO REFLECT ROW INTERCHANGES
  49. C
  50. 410 CONTINUE
  51. I=0
  52. 412 I=I+1
  53. IF(I.EQ.M) GO TO 418
  54. J=IR(I)
  55. IF(J.EQ.I) GO TO 412
  56. IF(J.LT.0) GO TO 412
  57. IR(I)=-IR(I)
  58. DO 413 JB=1,NB
  59. RNORM(JB)=B(I,JB)
  60. 413 CONTINUE
  61. IJ=I
  62. 414 DO 415 JB=1,NB
  63. B(IJ,JB)=B(J,JB)
  64. 415 CONTINUE
  65. IJ=J
  66. J=IR(IJ)
  67. IR(IJ)=-IR(IJ)
  68. IF(J.NE.I) GO TO 414
  69. DO 416 JB=1,NB
  70. B(IJ,JB)=RNORM(JB)
  71. 416 CONTINUE
  72. GO TO 412
  73. 418 CONTINUE
  74. DO 420 I=1,M
  75. IR(I)=ABS(IR(I))
  76. 420 CONTINUE
  77. C
  78. C APPLY HOUSEHOLDER TRANSFORMATIONS TO B
  79. C
  80. DO 430 J=1,K
  81. TT=A(J,J)
  82. A(J,J)=H(J)
  83. DO 425 I=1,NB
  84. BB=-DDOT(M-J+1,A(J,J),1,B(J,I),1)/H(J)
  85. CALL DAXPY(M-J+1,BB,A(J,J),1,B(J,I),1)
  86. 425 CONTINUE
  87. A(J,J)=TT
  88. 430 CONTINUE
  89. C
  90. C FIND NORMS OF RESIDUAL VECTOR(S)..(BEFORE OVERWRITE B)
  91. C
  92. DO 440 JB=1,NB
  93. RNORM(JB)=DNRM2((M-K),B(KP1,JB),1)
  94. 440 CONTINUE
  95. C
  96. C BACK SOLVE UPPER TRIANGULAR R
  97. C
  98. I=K
  99. 442 DO 444 JB=1,NB
  100. B(I,JB)=B(I,JB)/A(I,I)
  101. 444 CONTINUE
  102. IF(I.EQ.1) GO TO 450
  103. IM1=I-1
  104. DO 448 JB=1,NB
  105. CALL DAXPY(IM1,-B(I,JB),A(1,I),1,B(1,JB),1)
  106. 448 CONTINUE
  107. I=IM1
  108. GO TO 442
  109. 450 CONTINUE
  110. C
  111. C RANK LT N
  112. C
  113. C TRUNCATED SOLUTION
  114. C
  115. IF(K.EQ.N) GO TO 480
  116. DO 460 JB=1,NB
  117. DO 460 I=KP1,N
  118. B(I,JB)=0.0D0
  119. 460 CONTINUE
  120. IF(MODE.EQ.1) GO TO 480
  121. C
  122. C MINIMAL LENGTH SOLUTION
  123. C
  124. NMK=N-K
  125. DO 470 JB=1,NB
  126. DO 465 I=1,K
  127. TT=-DDOT(NMK,A(I,KP1),MDA,B(KP1,JB),1)/W(I)
  128. TT=TT-B(I,JB)
  129. CALL DAXPY(NMK,TT,A(I,KP1),MDA,B(KP1,JB),1)
  130. B(I,JB)=B(I,JB)+TT*W(I)
  131. 465 CONTINUE
  132. 470 CONTINUE
  133. C
  134. C
  135. C REORDER B TO REFLECT COLUMN INTERCHANGES
  136. C
  137. 480 CONTINUE
  138. I=0
  139. 482 I=I+1
  140. IF(I.EQ.N) GO TO 488
  141. J=IC(I)
  142. IF(J.EQ.I) GO TO 482
  143. IF(J.LT.0) GO TO 482
  144. IC(I)=-IC(I)
  145. 484 CALL DSWAP(NB,B(J,1),MDB,B(I,1),MDB)
  146. IJ=IC(J)
  147. IC(J)=-IC(J)
  148. J=IJ
  149. IF(J.EQ.I) GO TO 482
  150. GO TO 484
  151. 488 CONTINUE
  152. DO 490 I=1,N
  153. IC(I)=ABS(IC(I))
  154. 490 CONTINUE
  155. C
  156. C SOLUTION VECTORS ARE IN FIRST N ROWS OF B(,)
  157. C
  158. RETURN
  159. END