du11us.f 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. *DECK DU11US
  2. SUBROUTINE DU11US (A, MDA, M, N, UB, DB, MODE, NP, KRANK, KSURE,
  3. + H, W, EB, IR, IC)
  4. C***BEGIN PROLOGUE DU11US
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to DULSIA
  7. C***LIBRARY SLATEC
  8. C***TYPE DOUBLE PRECISION (U11US-S, DU11US-D)
  9. C***AUTHOR (UNKNOWN)
  10. C***DESCRIPTION
  11. C
  12. C This routine performs an LQ factorization of the
  13. C matrix A using Householder transformations. Row
  14. C and column pivots are chosen to reduce the growth
  15. C of round-off and to help detect possible rank
  16. C deficiency.
  17. C
  18. C***SEE ALSO DULSIA
  19. C***ROUTINES CALLED DAXPY, DDOT, DNRM2, DSCAL, DSWAP, IDAMAX, ISWAP,
  20. C XERMSG
  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 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  27. C 900328 Added TYPE section. (WRB)
  28. C***END PROLOGUE DU11US
  29. IMPLICIT DOUBLE PRECISION (A-H,O-Z)
  30. DOUBLE PRECISION DDOT,DNRM2
  31. DIMENSION A(MDA,*),UB(*),DB(*),H(*),W(*),EB(*)
  32. INTEGER IC(*),IR(*)
  33. C
  34. C INITIALIZATION
  35. C
  36. C***FIRST EXECUTABLE STATEMENT DU11US
  37. J=0
  38. KRANK=M
  39. DO 10 I=1,N
  40. IC(I)=I
  41. 10 CONTINUE
  42. DO 12 I=1,M
  43. IR(I)=I
  44. 12 CONTINUE
  45. C
  46. C DETERMINE REL AND ABS ERROR VECTORS
  47. C
  48. C
  49. C
  50. C CALCULATE ROW LENGTH
  51. C
  52. DO 30 I=1,M
  53. H(I)=DNRM2(N,A(I,1),MDA)
  54. W(I)=H(I)
  55. 30 CONTINUE
  56. C
  57. C INITIALIZE ERROR BOUNDS
  58. C
  59. DO 40 I=1,M
  60. EB(I)=MAX(DB(I),UB(I)*H(I))
  61. UB(I)=EB(I)
  62. DB(I)=0.0D0
  63. 40 CONTINUE
  64. C
  65. C DISCARD SELF DEPENDENT ROWS
  66. C
  67. I=1
  68. 50 IF(EB(I).GE.H(I)) GO TO 60
  69. IF(I.EQ.KRANK) GO TO 70
  70. I=I+1
  71. GO TO 50
  72. C
  73. C MATRIX REDUCTION
  74. C
  75. 60 CONTINUE
  76. KK=KRANK
  77. KRANK=KRANK-1
  78. IF(MODE.EQ.0) RETURN
  79. IF(I.GT.NP) GO TO 64
  80. CALL XERMSG ('SLATEC', 'DU11US',
  81. + 'FIRST NP ROWS ARE LINEARLY DEPENDENT', 8, 0)
  82. KRANK=I-1
  83. RETURN
  84. 64 CONTINUE
  85. IF(I.GT.KRANK) GO TO 70
  86. CALL DSWAP(1,EB(I),1,EB(KK),1)
  87. CALL DSWAP(1,UB(I),1,UB(KK),1)
  88. CALL DSWAP(1,W(I),1,W(KK),1)
  89. CALL DSWAP(1,H(I),1,H(KK),1)
  90. CALL ISWAP(1,IR(I),1,IR(KK),1)
  91. CALL DSWAP(N,A(I,1),MDA,A(KK,1),MDA)
  92. GO TO 50
  93. C
  94. C TEST FOR ZERO RANK
  95. C
  96. 70 IF(KRANK.GT.0) GO TO 80
  97. KRANK=0
  98. KSURE=0
  99. RETURN
  100. 80 CONTINUE
  101. C
  102. C M A I N L O O P
  103. C
  104. 110 CONTINUE
  105. J=J+1
  106. JP1=J+1
  107. JM1=J-1
  108. KZ=KRANK
  109. IF(J.LE.NP) KZ=J
  110. C
  111. C EACH ROW HAS NN=N-J+1 COMPONENTS
  112. C
  113. NN=N-J+1
  114. C
  115. C UB DETERMINES ROW PIVOT
  116. C
  117. 115 IMIN=J
  118. IF(H(J).EQ.0.D0) GO TO 170
  119. RMIN=UB(J)/H(J)
  120. DO 120 I=J,KZ
  121. IF(UB(I).GE.H(I)*RMIN) GO TO 120
  122. RMIN=UB(I)/H(I)
  123. IMIN=I
  124. 120 CONTINUE
  125. C
  126. C TEST FOR RANK DEFICIENCY
  127. C
  128. IF(RMIN.LT.1.0D0) GO TO 200
  129. TT=(EB(IMIN)+ABS(DB(IMIN)))/H(IMIN)
  130. IF(TT.GE.1.0D0) GO TO 170
  131. C COMPUTE EXACT UB
  132. DO 125 I=1,JM1
  133. W(I)=A(IMIN,I)
  134. 125 CONTINUE
  135. L=JM1
  136. 130 W(L)=W(L)/A(L,L)
  137. IF(L.EQ.1) GO TO 150
  138. LM1=L-1
  139. DO 140 I=L,JM1
  140. W(LM1)=W(LM1)-A(I,LM1)*W(I)
  141. 140 CONTINUE
  142. L=LM1
  143. GO TO 130
  144. 150 TT=EB(IMIN)
  145. DO 160 I=1,JM1
  146. TT=TT+ABS(W(I))*EB(I)
  147. 160 CONTINUE
  148. UB(IMIN)=TT
  149. IF(UB(IMIN)/H(IMIN).GE.1.0D0) GO TO 170
  150. GO TO 200
  151. C
  152. C MATRIX REDUCTION
  153. C
  154. 170 CONTINUE
  155. KK=KRANK
  156. KRANK=KRANK-1
  157. KZ=KRANK
  158. IF(MODE.EQ.0) RETURN
  159. IF(J.GT.NP) GO TO 172
  160. CALL XERMSG ('SLATEC', 'DU11US',
  161. + 'FIRST NP ROWS ARE LINEARLY DEPENDENT', 8, 0)
  162. KRANK=J-1
  163. RETURN
  164. 172 CONTINUE
  165. IF(IMIN.GT.KRANK) GO TO 180
  166. CALL ISWAP(1,IR(IMIN),1,IR(KK),1)
  167. CALL DSWAP(N,A(IMIN,1),MDA,A(KK,1),MDA)
  168. CALL DSWAP(1,EB(IMIN),1,EB(KK),1)
  169. CALL DSWAP(1,UB(IMIN),1,UB(KK),1)
  170. CALL DSWAP(1,DB(IMIN),1,DB(KK),1)
  171. CALL DSWAP(1,W(IMIN),1,W(KK),1)
  172. CALL DSWAP(1,H(IMIN),1,H(KK),1)
  173. 180 IF(J.GT.KRANK) GO TO 300
  174. GO TO 115
  175. C
  176. C ROW PIVOT
  177. C
  178. 200 IF(IMIN.EQ.J) GO TO 230
  179. CALL DSWAP(1,H(J),1,H(IMIN),1)
  180. CALL DSWAP(N,A(J,1),MDA,A(IMIN,1),MDA)
  181. CALL DSWAP(1,EB(J),1,EB(IMIN),1)
  182. CALL DSWAP(1,UB(J),1,UB(IMIN),1)
  183. CALL DSWAP(1,DB(J),1,DB(IMIN),1)
  184. CALL DSWAP(1,W(J),1,W(IMIN),1)
  185. CALL ISWAP(1,IR(J),1,IR(IMIN),1)
  186. C
  187. C COLUMN PIVOT
  188. C
  189. 230 CONTINUE
  190. JMAX=IDAMAX(NN,A(J,J),MDA)
  191. JMAX=JMAX+J-1
  192. IF(JMAX.EQ.J) GO TO 240
  193. CALL DSWAP(M,A(1,J),1,A(1,JMAX),1)
  194. CALL ISWAP(1,IC(J),1,IC(JMAX),1)
  195. 240 CONTINUE
  196. C
  197. C APPLY HOUSEHOLDER TRANSFORMATION
  198. C
  199. TN=DNRM2(NN,A(J,J),MDA)
  200. IF(TN.EQ.0.0D0) GO TO 170
  201. IF(A(J,J).NE.0.0D0) TN=SIGN(TN,A(J,J))
  202. CALL DSCAL(NN,1.0D0/TN,A(J,J),MDA)
  203. A(J,J)=A(J,J)+1.0D0
  204. IF(J.EQ.M) GO TO 250
  205. DO 248 I=JP1,M
  206. BB=-DDOT(NN,A(J,J),MDA,A(I,J),MDA)/A(J,J)
  207. CALL DAXPY(NN,BB,A(J,J),MDA,A(I,J),MDA)
  208. IF(I.LE.NP) GO TO 248
  209. IF(H(I).EQ.0.0D0) GO TO 248
  210. TT=1.0D0-(ABS(A(I,J))/H(I))**2
  211. TT=MAX(TT,0.0D0)
  212. T=TT
  213. TT=1.0D0+.05D0*TT*(H(I)/W(I))**2
  214. IF(TT.EQ.1.0D0) GO TO 244
  215. H(I)=H(I)*SQRT(T)
  216. GO TO 246
  217. 244 CONTINUE
  218. H(I)=DNRM2(N-J,A(I,J+1),MDA)
  219. W(I)=H(I)
  220. 246 CONTINUE
  221. 248 CONTINUE
  222. 250 CONTINUE
  223. H(J)=A(J,J)
  224. A(J,J)=-TN
  225. C
  226. C
  227. C UPDATE UB, DB
  228. C
  229. UB(J)=UB(J)/ABS(A(J,J))
  230. DB(J)=(SIGN(EB(J),DB(J))+DB(J))/A(J,J)
  231. IF(J.EQ.KRANK) GO TO 300
  232. DO 260 I=JP1,KRANK
  233. UB(I)=UB(I)+ABS(A(I,J))*UB(J)
  234. DB(I)=DB(I)-A(I,J)*DB(J)
  235. 260 CONTINUE
  236. GO TO 110
  237. C
  238. C E N D M A I N L O O P
  239. C
  240. 300 CONTINUE
  241. C
  242. C COMPUTE KSURE
  243. C
  244. KM1=KRANK-1
  245. DO 318 I=1,KM1
  246. IS=0
  247. KMI=KRANK-I
  248. DO 315 II=1,KMI
  249. IF(UB(II).LE.UB(II+1)) GO TO 315
  250. IS=1
  251. TEMP=UB(II)
  252. UB(II)=UB(II+1)
  253. UB(II+1)=TEMP
  254. 315 CONTINUE
  255. IF(IS.EQ.0) GO TO 320
  256. 318 CONTINUE
  257. 320 CONTINUE
  258. KSURE=0
  259. SUM=0.0D0
  260. DO 328 I=1,KRANK
  261. R2=UB(I)*UB(I)
  262. IF(R2+SUM.GE.1.0D0) GO TO 330
  263. SUM=SUM+R2
  264. KSURE=KSURE+1
  265. 328 CONTINUE
  266. 330 CONTINUE
  267. C
  268. C IF SYSTEM IS OF REDUCED RANK AND MODE = 2
  269. C COMPLETE THE DECOMPOSITION FOR SHORTEST LEAST SQUARES SOLUTION
  270. C
  271. IF(KRANK.EQ.M .OR. MODE.LT.2) GO TO 360
  272. MMK=M-KRANK
  273. KP1=KRANK+1
  274. I=KRANK
  275. 340 TN=DNRM2(MMK,A(KP1,I),1)/A(I,I)
  276. TN=A(I,I)*SQRT(1.0D0+TN*TN)
  277. CALL DSCAL(MMK,1.0D0/TN,A(KP1,I),1)
  278. W(I)=A(I,I)/TN+1.0D0
  279. A(I,I)=-TN
  280. IF(I.EQ.1) GO TO 350
  281. IM1=I-1
  282. DO 345 II=1,IM1
  283. TT=-DDOT(MMK,A(KP1,II),1,A(KP1,I),1)/W(I)
  284. TT=TT-A(I,II)
  285. CALL DAXPY(MMK,TT,A(KP1,I),1,A(KP1,II),1)
  286. A(I,II)=A(I,II)+TT*W(I)
  287. 345 CONTINUE
  288. I=I-1
  289. GO TO 340
  290. 350 CONTINUE
  291. 360 CONTINUE
  292. RETURN
  293. END