du11ls.f 6.8 KB

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