u11us.f 6.6 KB

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