du12us.f 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. *DECK DU12US
  2. SUBROUTINE DU12US (A, MDA, M, N, B, MDB, NB, MODE, KRANK, RNORM,
  3. + H, W, IR, IC)
  4. C***BEGIN PROLOGUE DU12US
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to DULSIA
  7. C***LIBRARY SLATEC
  8. C***TYPE DOUBLE PRECISION (U12US-S, DU12US-D)
  9. C***AUTHOR (UNKNOWN)
  10. C***DESCRIPTION
  11. C
  12. C Given the Householder LQ 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 DULSIA
  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 DU12US
  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 DU12US
  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 IF A IS OF REDUCED RANK AND MODE=2,
  79. C APPLY HOUSEHOLDER TRANSFORMATIONS TO B
  80. C
  81. IF(MODE.LT.2 .OR. K.EQ.M) GO TO 440
  82. MMK=M-K
  83. DO 430 JB=1,NB
  84. DO 425 J=1,K
  85. I=KP1-J
  86. TT=-DDOT(MMK,A(KP1,I),1,B(KP1,JB),1)/W(I)
  87. TT=TT-B(I,JB)
  88. CALL DAXPY(MMK,TT,A(KP1,I),1,B(KP1,JB),1)
  89. B(I,JB)=B(I,JB)+TT*W(I)
  90. 425 CONTINUE
  91. 430 CONTINUE
  92. C
  93. C FIND NORMS OF RESIDUAL VECTOR(S)..(BEFORE OVERWRITE B)
  94. C
  95. 440 DO 442 JB=1,NB
  96. RNORM(JB)=DNRM2((M-K),B(KP1,JB),1)
  97. 442 CONTINUE
  98. C
  99. C BACK SOLVE LOWER TRIANGULAR L
  100. C
  101. DO 450 JB=1,NB
  102. DO 448 I=1,K
  103. B(I,JB)=B(I,JB)/A(I,I)
  104. IF(I.EQ.K) GO TO 450
  105. IP1=I+1
  106. CALL DAXPY(K-I,-B(I,JB),A(IP1,I),1,B(IP1,JB),1)
  107. 448 CONTINUE
  108. 450 CONTINUE
  109. C
  110. C
  111. C TRUNCATED SOLUTION
  112. C
  113. IF(K.EQ.N) GO TO 462
  114. DO 460 JB=1,NB
  115. DO 460 I=KP1,N
  116. B(I,JB)=0.0D0
  117. 460 CONTINUE
  118. C
  119. C APPLY HOUSEHOLDER TRANSFORMATIONS TO B
  120. C
  121. 462 DO 470 I=1,K
  122. J=KP1-I
  123. TT=A(J,J)
  124. A(J,J)=H(J)
  125. DO 465 JB=1,NB
  126. BB=-DDOT(N-J+1,A(J,J),MDA,B(J,JB),1)/H(J)
  127. CALL DAXPY(N-J+1,BB,A(J,J),MDA,B(J,JB),1)
  128. 465 CONTINUE
  129. A(J,J)=TT
  130. 470 CONTINUE
  131. C
  132. C
  133. C REORDER B TO REFLECT COLUMN INTERCHANGES
  134. C
  135. I=0
  136. 482 I=I+1
  137. IF(I.EQ.N) GO TO 488
  138. J=IC(I)
  139. IF(J.EQ.I) GO TO 482
  140. IF(J.LT.0) GO TO 482
  141. IC(I)=-IC(I)
  142. 484 CALL DSWAP(NB,B(J,1),MDB,B(I,1),MDB)
  143. IJ=IC(J)
  144. IC(J)=-IC(J)
  145. J=IJ
  146. IF(J.EQ.I) GO TO 482
  147. GO TO 484
  148. 488 CONTINUE
  149. DO 490 I=1,N
  150. IC(I)=ABS(IC(I))
  151. 490 CONTINUE
  152. C
  153. C SOLUTION VECTORS ARE IN FIRST N ROWS OF B(,)
  154. C
  155. RETURN
  156. END