wnlit.f 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. *DECK WNLIT
  2. SUBROUTINE WNLIT (W, MDW, M, N, L, IPIVOT, ITYPE, H, SCALE, RNORM,
  3. + IDOPE, DOPE, DONE)
  4. C***BEGIN PROLOGUE WNLIT
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to WNNLS
  7. C***LIBRARY SLATEC
  8. C***TYPE SINGLE PRECISION (WNLIT-S, DWNLIT-D)
  9. C***AUTHOR Hanson, R. J., (SNLA)
  10. C Haskell, K. H., (SNLA)
  11. C***DESCRIPTION
  12. C
  13. C This is a companion subprogram to WNNLS( ).
  14. C The documentation for WNNLS( ) has complete usage instructions.
  15. C
  16. C Note The M by (N+1) matrix W( , ) contains the rt. hand side
  17. C B as the (N+1)st col.
  18. C
  19. C Triangularize L1 by L1 subsystem, where L1=MIN(M,L), with
  20. C col interchanges.
  21. C
  22. C***SEE ALSO WNNLS
  23. C***ROUTINES CALLED H12, ISAMAX, SCOPY, SROTM, SROTMG, SSCAL, SSWAP,
  24. C WNLT1, WNLT2, WNLT3
  25. C***REVISION HISTORY (YYMMDD)
  26. C 790701 DATE WRITTEN
  27. C 890531 Changed all specific intrinsics to generic. (WRB)
  28. C 890618 Completely restructured and revised. (WRB & RWC)
  29. C 890620 Revised to make WNLT1, WNLT2, and WNLT3 subroutines. (RWC)
  30. C 891214 Prologue converted to Version 4.0 format. (BAB)
  31. C 900328 Added TYPE section. (WRB)
  32. C***END PROLOGUE WNLIT
  33. INTEGER IDOPE(*), IPIVOT(*), ITYPE(*), L, M, MDW, N
  34. REAL DOPE(*), H(*), RNORM, SCALE(*), W(MDW,*)
  35. LOGICAL DONE
  36. C
  37. EXTERNAL H12, ISAMAX, SCOPY, SROTM, SROTMG, SSCAL, SSWAP, WNLT1,
  38. * WNLT2, WNLT3
  39. INTEGER ISAMAX
  40. LOGICAL WNLT2
  41. C
  42. REAL ALSQ, AMAX, EANORM, FACTOR, HBAR, RN, SPARAM(5),
  43. * T, TAU
  44. INTEGER I, I1, IMAX, IR, J, J1, JJ, JP, KRANK, L1, LB, LEND, ME,
  45. * MEND, NIV, NSOLN
  46. LOGICAL INDEP, RECALC
  47. C
  48. C***FIRST EXECUTABLE STATEMENT WNLIT
  49. ME = IDOPE(1)
  50. NSOLN = IDOPE(2)
  51. L1 = IDOPE(3)
  52. C
  53. ALSQ = DOPE(1)
  54. EANORM = DOPE(2)
  55. TAU = DOPE(3)
  56. C
  57. LB = MIN(M-1,L)
  58. RECALC = .TRUE.
  59. RNORM = 0.E0
  60. KRANK = 0
  61. C
  62. C We set FACTOR=1.0 so that the heavy weight ALAMDA will be
  63. C included in the test for column independence.
  64. C
  65. FACTOR = 1.E0
  66. LEND = L
  67. DO 180 I=1,LB
  68. C
  69. C Set IR to point to the I-th row.
  70. C
  71. IR = I
  72. MEND = M
  73. CALL WNLT1 (I, LEND, M, IR, MDW, RECALC, IMAX, HBAR, H, SCALE,
  74. + W)
  75. C
  76. C Update column SS and find pivot column.
  77. C
  78. CALL WNLT3 (I, IMAX, M, MDW, IPIVOT, H, W)
  79. C
  80. C Perform column interchange.
  81. C Test independence of incoming column.
  82. C
  83. 130 IF (WNLT2(ME, MEND, IR, FACTOR, TAU, SCALE, W(1,I))) THEN
  84. C
  85. C Eliminate I-th column below diagonal using modified Givens
  86. C transformations applied to (A B).
  87. C
  88. C When operating near the ME line, use the largest element
  89. C above it as the pivot.
  90. C
  91. DO 160 J=M,I+1,-1
  92. JP = J-1
  93. IF (J.EQ.ME+1) THEN
  94. IMAX = ME
  95. AMAX = SCALE(ME)*W(ME,I)**2
  96. DO 150 JP=J-1,I,-1
  97. T = SCALE(JP)*W(JP,I)**2
  98. IF (T.GT.AMAX) THEN
  99. IMAX = JP
  100. AMAX = T
  101. ENDIF
  102. 150 CONTINUE
  103. JP = IMAX
  104. ENDIF
  105. C
  106. IF (W(J,I).NE.0.E0) THEN
  107. CALL SROTMG (SCALE(JP), SCALE(J), W(JP,I), W(J,I),
  108. + SPARAM)
  109. W(J,I) = 0.E0
  110. CALL SROTM (N+1-I, W(JP,I+1), MDW, W(J,I+1), MDW,
  111. + SPARAM)
  112. ENDIF
  113. 160 CONTINUE
  114. ELSE IF (LEND.GT.I) THEN
  115. C
  116. C Column I is dependent. Swap with column LEND.
  117. C Perform column interchange,
  118. C and find column in remaining set with largest SS.
  119. C
  120. CALL WNLT3 (I, LEND, M, MDW, IPIVOT, H, W)
  121. LEND = LEND - 1
  122. IMAX = ISAMAX(LEND-I+1, H(I), 1) + I - 1
  123. HBAR = H(IMAX)
  124. GO TO 130
  125. ELSE
  126. KRANK = I - 1
  127. GO TO 190
  128. ENDIF
  129. 180 CONTINUE
  130. KRANK = L1
  131. C
  132. 190 IF (KRANK.LT.ME) THEN
  133. FACTOR = ALSQ
  134. DO 200 I=KRANK+1,ME
  135. CALL SCOPY (L, 0.E0, 0, W(I,1), MDW)
  136. 200 CONTINUE
  137. C
  138. C Determine the rank of the remaining equality constraint
  139. C equations by eliminating within the block of constrained
  140. C variables. Remove any redundant constraints.
  141. C
  142. RECALC = .TRUE.
  143. LB = MIN(L+ME-KRANK, N)
  144. DO 270 I=L+1,LB
  145. IR = KRANK + I - L
  146. LEND = N
  147. MEND = ME
  148. CALL WNLT1 (I, LEND, ME, IR, MDW, RECALC, IMAX, HBAR, H,
  149. + SCALE, W)
  150. C
  151. C Update col ss and find pivot col
  152. C
  153. CALL WNLT3 (I, IMAX, M, MDW, IPIVOT, H, W)
  154. C
  155. C Perform column interchange
  156. C Eliminate elements in the I-th col.
  157. C
  158. DO 240 J=ME,IR+1,-1
  159. IF (W(J,I).NE.0.E0) THEN
  160. CALL SROTMG (SCALE(J-1), SCALE(J), W(J-1,I), W(J,I),
  161. + SPARAM)
  162. W(J,I) = 0.E0
  163. CALL SROTM (N+1-I, W(J-1,I+1), MDW,W(J,I+1), MDW,
  164. + SPARAM)
  165. ENDIF
  166. 240 CONTINUE
  167. C
  168. C I=column being eliminated.
  169. C Test independence of incoming column.
  170. C Remove any redundant or dependent equality constraints.
  171. C
  172. IF (.NOT.WNLT2(ME, MEND, IR, FACTOR,TAU,SCALE,W(1,I))) THEN
  173. JJ = IR
  174. DO 260 IR=JJ,ME
  175. CALL SCOPY (N, 0.E0, 0, W(IR,1), MDW)
  176. RNORM = RNORM + (SCALE(IR)*W(IR,N+1)/ALSQ)*W(IR,N+1)
  177. W(IR,N+1) = 0.E0
  178. SCALE(IR) = 1.E0
  179. C
  180. C Reclassify the zeroed row as a least squares equation.
  181. C
  182. ITYPE(IR) = 1
  183. 260 CONTINUE
  184. C
  185. C Reduce ME to reflect any discovered dependent equality
  186. C constraints.
  187. C
  188. ME = JJ - 1
  189. GO TO 280
  190. ENDIF
  191. 270 CONTINUE
  192. ENDIF
  193. C
  194. C Try to determine the variables KRANK+1 through L1 from the
  195. C least squares equations. Continue the triangularization with
  196. C pivot element W(ME+1,I).
  197. C
  198. 280 IF (KRANK.LT.L1) THEN
  199. RECALC = .TRUE.
  200. C
  201. C Set FACTOR=ALSQ to remove effect of heavy weight from
  202. C test for column independence.
  203. C
  204. FACTOR = ALSQ
  205. DO 350 I=KRANK+1,L1
  206. C
  207. C Set IR to point to the ME+1-st row.
  208. C
  209. IR = ME+1
  210. LEND = L
  211. MEND = M
  212. CALL WNLT1 (I, L, M, IR, MDW, RECALC, IMAX, HBAR, H, SCALE,
  213. + W)
  214. C
  215. C Update column SS and find pivot column.
  216. C
  217. CALL WNLT3 (I, IMAX, M, MDW, IPIVOT, H, W)
  218. C
  219. C Perform column interchange.
  220. C Eliminate I-th column below the IR-th element.
  221. C
  222. DO 320 J=M,IR+1,-1
  223. IF (W(J,I).NE.0.E0) THEN
  224. CALL SROTMG (SCALE(J-1), SCALE(J), W(J-1,I), W(J,I),
  225. + SPARAM)
  226. W(J,I) = 0.E0
  227. CALL SROTM (N+1-I, W(J-1,I+1), MDW, W(J,I+1), MDW,
  228. + SPARAM)
  229. ENDIF
  230. 320 CONTINUE
  231. C
  232. C Test if new pivot element is near zero.
  233. C If so, the column is dependent.
  234. C Then check row norm test to be classified as independent.
  235. C
  236. T = SCALE(IR)*W(IR,I)**2
  237. INDEP = T .GT. (TAU*EANORM)**2
  238. IF (INDEP) THEN
  239. RN = 0.E0
  240. DO 340 I1=IR,M
  241. DO 330 J1=I+1,N
  242. RN = MAX(RN, SCALE(I1)*W(I1,J1)**2)
  243. 330 CONTINUE
  244. 340 CONTINUE
  245. INDEP = T .GT. RN*TAU**2
  246. ENDIF
  247. C
  248. C If independent, swap the IR-th and KRANK+1-th rows to
  249. C maintain the triangular form. Update the rank indicator
  250. C KRANK and the equality constraint pointer ME.
  251. C
  252. IF (.NOT.INDEP) GO TO 360
  253. CALL SSWAP(N+1, W(KRANK+1,1), MDW, W(IR,1), MDW)
  254. CALL SSWAP(1, SCALE(KRANK+1), 1, SCALE(IR), 1)
  255. C
  256. C Reclassify the least square equation as an equality
  257. C constraint and rescale it.
  258. C
  259. ITYPE(IR) = 0
  260. T = SQRT(SCALE(KRANK+1))
  261. CALL SSCAL(N+1, T, W(KRANK+1,1), MDW)
  262. SCALE(KRANK+1) = ALSQ
  263. ME = ME+1
  264. KRANK = KRANK+1
  265. 350 CONTINUE
  266. ENDIF
  267. C
  268. C If pseudorank is less than L, apply Householder transformation.
  269. C from right.
  270. C
  271. 360 IF (KRANK.LT.L) THEN
  272. DO 370 J=KRANK,1,-1
  273. CALL H12 (1, J, KRANK+1, L, W(J,1), MDW, H(J), W, MDW, 1,
  274. + J-1)
  275. 370 CONTINUE
  276. ENDIF
  277. C
  278. NIV = KRANK + NSOLN - L
  279. IF (L.EQ.N) DONE = .TRUE.
  280. C
  281. C End of initial triangularization.
  282. C
  283. IDOPE(1) = ME
  284. IDOPE(2) = KRANK
  285. IDOPE(3) = NIV
  286. RETURN
  287. END