u11ls.f 6.6 KB

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