dwnlit.f 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. *DECK DWNLIT
  2. SUBROUTINE DWNLIT (W, MDW, M, N, L, IPIVOT, ITYPE, H, SCALE,
  3. + RNORM, IDOPE, DOPE, DONE)
  4. C***BEGIN PROLOGUE DWNLIT
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to DWNNLS
  7. C***LIBRARY SLATEC
  8. C***TYPE DOUBLE 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 DWNNLS( ).
  14. C The documentation for DWNNLS( ) 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 DWNNLS
  23. C***ROUTINES CALLED DCOPY, DH12, DROTM, DROTMG, DSCAL, DSWAP, DWNLT1,
  24. C DWNLT2, DWNLT3, IDAMAX
  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 900604 DP version created from SP version. . (RWC)
  33. C***END PROLOGUE DWNLIT
  34. INTEGER IDOPE(*), IPIVOT(*), ITYPE(*), L, M, MDW, N
  35. DOUBLE PRECISION DOPE(*), H(*), RNORM, SCALE(*), W(MDW,*)
  36. LOGICAL DONE
  37. C
  38. EXTERNAL DCOPY, DH12, DROTM, DROTMG, DSCAL, DSWAP, DWNLT1,
  39. * DWNLT2, DWNLT3, IDAMAX
  40. INTEGER IDAMAX
  41. LOGICAL DWNLT2
  42. C
  43. DOUBLE PRECISION ALSQ, AMAX, EANORM, FACTOR, HBAR, RN, SPARAM(5),
  44. * T, TAU
  45. INTEGER I, I1, IMAX, IR, J, J1, JJ, JP, KRANK, L1, LB, LEND, ME,
  46. * MEND, NIV, NSOLN
  47. LOGICAL INDEP, RECALC
  48. C
  49. C***FIRST EXECUTABLE STATEMENT DWNLIT
  50. ME = IDOPE(1)
  51. NSOLN = IDOPE(2)
  52. L1 = IDOPE(3)
  53. C
  54. ALSQ = DOPE(1)
  55. EANORM = DOPE(2)
  56. TAU = DOPE(3)
  57. C
  58. LB = MIN(M-1,L)
  59. RECALC = .TRUE.
  60. RNORM = 0.D0
  61. KRANK = 0
  62. C
  63. C We set FACTOR=1.0 so that the heavy weight ALAMDA will be
  64. C included in the test for column independence.
  65. C
  66. FACTOR = 1.D0
  67. LEND = L
  68. DO 180 I=1,LB
  69. C
  70. C Set IR to point to the I-th row.
  71. C
  72. IR = I
  73. MEND = M
  74. CALL DWNLT1 (I, LEND, M, IR, MDW, RECALC, IMAX, HBAR, H, SCALE,
  75. + W)
  76. C
  77. C Update column SS and find pivot column.
  78. C
  79. CALL DWNLT3 (I, IMAX, M, MDW, IPIVOT, H, W)
  80. C
  81. C Perform column interchange.
  82. C Test independence of incoming column.
  83. C
  84. 130 IF (DWNLT2(ME, MEND, IR, FACTOR, TAU, SCALE, W(1,I))) THEN
  85. C
  86. C Eliminate I-th column below diagonal using modified Givens
  87. C transformations applied to (A B).
  88. C
  89. C When operating near the ME line, use the largest element
  90. C above it as the pivot.
  91. C
  92. DO 160 J=M,I+1,-1
  93. JP = J-1
  94. IF (J.EQ.ME+1) THEN
  95. IMAX = ME
  96. AMAX = SCALE(ME)*W(ME,I)**2
  97. DO 150 JP=J-1,I,-1
  98. T = SCALE(JP)*W(JP,I)**2
  99. IF (T.GT.AMAX) THEN
  100. IMAX = JP
  101. AMAX = T
  102. ENDIF
  103. 150 CONTINUE
  104. JP = IMAX
  105. ENDIF
  106. C
  107. IF (W(J,I).NE.0.D0) THEN
  108. CALL DROTMG (SCALE(JP), SCALE(J), W(JP,I), W(J,I),
  109. + SPARAM)
  110. W(J,I) = 0.D0
  111. CALL DROTM (N+1-I, W(JP,I+1), MDW, W(J,I+1), MDW,
  112. + SPARAM)
  113. ENDIF
  114. 160 CONTINUE
  115. ELSE IF (LEND.GT.I) THEN
  116. C
  117. C Column I is dependent. Swap with column LEND.
  118. C Perform column interchange,
  119. C and find column in remaining set with largest SS.
  120. C
  121. CALL DWNLT3 (I, LEND, M, MDW, IPIVOT, H, W)
  122. LEND = LEND - 1
  123. IMAX = IDAMAX(LEND-I+1, H(I), 1) + I - 1
  124. HBAR = H(IMAX)
  125. GO TO 130
  126. ELSE
  127. KRANK = I - 1
  128. GO TO 190
  129. ENDIF
  130. 180 CONTINUE
  131. KRANK = L1
  132. C
  133. 190 IF (KRANK.LT.ME) THEN
  134. FACTOR = ALSQ
  135. DO 200 I=KRANK+1,ME
  136. CALL DCOPY (L, 0.D0, 0, W(I,1), MDW)
  137. 200 CONTINUE
  138. C
  139. C Determine the rank of the remaining equality constraint
  140. C equations by eliminating within the block of constrained
  141. C variables. Remove any redundant constraints.
  142. C
  143. RECALC = .TRUE.
  144. LB = MIN(L+ME-KRANK, N)
  145. DO 270 I=L+1,LB
  146. IR = KRANK + I - L
  147. LEND = N
  148. MEND = ME
  149. CALL DWNLT1 (I, LEND, ME, IR, MDW, RECALC, IMAX, HBAR, H,
  150. + SCALE, W)
  151. C
  152. C Update col ss and find pivot col
  153. C
  154. CALL DWNLT3 (I, IMAX, M, MDW, IPIVOT, H, W)
  155. C
  156. C Perform column interchange
  157. C Eliminate elements in the I-th col.
  158. C
  159. DO 240 J=ME,IR+1,-1
  160. IF (W(J,I).NE.0.D0) THEN
  161. CALL DROTMG (SCALE(J-1), SCALE(J), W(J-1,I), W(J,I),
  162. + SPARAM)
  163. W(J,I) = 0.D0
  164. CALL DROTM (N+1-I, W(J-1,I+1), MDW,W(J,I+1), MDW,
  165. + SPARAM)
  166. ENDIF
  167. 240 CONTINUE
  168. C
  169. C I=column being eliminated.
  170. C Test independence of incoming column.
  171. C Remove any redundant or dependent equality constraints.
  172. C
  173. IF (.NOT.DWNLT2(ME, MEND, IR, FACTOR,TAU,SCALE,W(1,I))) THEN
  174. JJ = IR
  175. DO 260 IR=JJ,ME
  176. CALL DCOPY (N, 0.D0, 0, W(IR,1), MDW)
  177. RNORM = RNORM + (SCALE(IR)*W(IR,N+1)/ALSQ)*W(IR,N+1)
  178. W(IR,N+1) = 0.D0
  179. SCALE(IR) = 1.D0
  180. C
  181. C Reclassify the zeroed row as a least squares equation.
  182. C
  183. ITYPE(IR) = 1
  184. 260 CONTINUE
  185. C
  186. C Reduce ME to reflect any discovered dependent equality
  187. C constraints.
  188. C
  189. ME = JJ - 1
  190. GO TO 280
  191. ENDIF
  192. 270 CONTINUE
  193. ENDIF
  194. C
  195. C Try to determine the variables KRANK+1 through L1 from the
  196. C least squares equations. Continue the triangularization with
  197. C pivot element W(ME+1,I).
  198. C
  199. 280 IF (KRANK.LT.L1) THEN
  200. RECALC = .TRUE.
  201. C
  202. C Set FACTOR=ALSQ to remove effect of heavy weight from
  203. C test for column independence.
  204. C
  205. FACTOR = ALSQ
  206. DO 350 I=KRANK+1,L1
  207. C
  208. C Set IR to point to the ME+1-st row.
  209. C
  210. IR = ME+1
  211. LEND = L
  212. MEND = M
  213. CALL DWNLT1 (I, L, M, IR, MDW, RECALC, IMAX, HBAR, H, SCALE,
  214. + W)
  215. C
  216. C Update column SS and find pivot column.
  217. C
  218. CALL DWNLT3 (I, IMAX, M, MDW, IPIVOT, H, W)
  219. C
  220. C Perform column interchange.
  221. C Eliminate I-th column below the IR-th element.
  222. C
  223. DO 320 J=M,IR+1,-1
  224. IF (W(J,I).NE.0.D0) THEN
  225. CALL DROTMG (SCALE(J-1), SCALE(J), W(J-1,I), W(J,I),
  226. + SPARAM)
  227. W(J,I) = 0.D0
  228. CALL DROTM (N+1-I, W(J-1,I+1), MDW, W(J,I+1), MDW,
  229. + SPARAM)
  230. ENDIF
  231. 320 CONTINUE
  232. C
  233. C Test if new pivot element is near zero.
  234. C If so, the column is dependent.
  235. C Then check row norm test to be classified as independent.
  236. C
  237. T = SCALE(IR)*W(IR,I)**2
  238. INDEP = T .GT. (TAU*EANORM)**2
  239. IF (INDEP) THEN
  240. RN = 0.D0
  241. DO 340 I1=IR,M
  242. DO 330 J1=I+1,N
  243. RN = MAX(RN, SCALE(I1)*W(I1,J1)**2)
  244. 330 CONTINUE
  245. 340 CONTINUE
  246. INDEP = T .GT. RN*TAU**2
  247. ENDIF
  248. C
  249. C If independent, swap the IR-th and KRANK+1-th rows to
  250. C maintain the triangular form. Update the rank indicator
  251. C KRANK and the equality constraint pointer ME.
  252. C
  253. IF (.NOT.INDEP) GO TO 360
  254. CALL DSWAP(N+1, W(KRANK+1,1), MDW, W(IR,1), MDW)
  255. CALL DSWAP(1, SCALE(KRANK+1), 1, SCALE(IR), 1)
  256. C
  257. C Reclassify the least square equation as an equality
  258. C constraint and rescale it.
  259. C
  260. ITYPE(IR) = 0
  261. T = SQRT(SCALE(KRANK+1))
  262. CALL DSCAL(N+1, T, W(KRANK+1,1), MDW)
  263. SCALE(KRANK+1) = ALSQ
  264. ME = ME+1
  265. KRANK = KRANK+1
  266. 350 CONTINUE
  267. ENDIF
  268. C
  269. C If pseudorank is less than L, apply Householder transformation.
  270. C from right.
  271. C
  272. 360 IF (KRANK.LT.L) THEN
  273. DO 370 J=KRANK,1,-1
  274. CALL DH12 (1, J, KRANK+1, L, W(J,1), MDW, H(J), W, MDW, 1,
  275. + J-1)
  276. 370 CONTINUE
  277. ENDIF
  278. C
  279. NIV = KRANK + NSOLN - L
  280. IF (L.EQ.N) DONE = .TRUE.
  281. C
  282. C End of initial triangularization.
  283. C
  284. IDOPE(1) = ME
  285. IDOPE(2) = KRANK
  286. IDOPE(3) = NIV
  287. RETURN
  288. END