dlsi.f 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. *DECK DLSI
  2. SUBROUTINE DLSI (W, MDW, MA, MG, N, PRGOPT, X, RNORM, MODE, WS,
  3. + IP)
  4. C***BEGIN PROLOGUE DLSI
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to DLSEI
  7. C***LIBRARY SLATEC
  8. C***TYPE DOUBLE PRECISION (LSI-S, DLSI-D)
  9. C***AUTHOR Hanson, R. J., (SNLA)
  10. C***DESCRIPTION
  11. C
  12. C This is a companion subprogram to DLSEI. The documentation for
  13. C DLSEI has complete usage instructions.
  14. C
  15. C Solve..
  16. C AX = B, A MA by N (least squares equations)
  17. C subject to..
  18. C
  19. C GX.GE.H, G MG by N (inequality constraints)
  20. C
  21. C Input..
  22. C
  23. C W(*,*) contains (A B) in rows 1,...,MA+MG, cols 1,...,N+1.
  24. C (G H)
  25. C
  26. C MDW,MA,MG,N
  27. C contain (resp) var. dimension of W(*,*),
  28. C and matrix dimensions.
  29. C
  30. C PRGOPT(*),
  31. C Program option vector.
  32. C
  33. C OUTPUT..
  34. C
  35. C X(*),RNORM
  36. C
  37. C Solution vector(unless MODE=2), length of AX-B.
  38. C
  39. C MODE
  40. C =0 Inequality constraints are compatible.
  41. C =2 Inequality constraints contradictory.
  42. C
  43. C WS(*),
  44. C Working storage of dimension K+N+(MG+2)*(N+7),
  45. C where K=MAX(MA+MG,N).
  46. C IP(MG+2*N+1)
  47. C Integer working storage
  48. C
  49. C***ROUTINES CALLED D1MACH, DASUM, DAXPY, DCOPY, DDOT, DH12, DHFTI,
  50. C DLPDP, DSCAL, DSWAP
  51. C***REVISION HISTORY (YYMMDD)
  52. C 790701 DATE WRITTEN
  53. C 890531 Changed all specific intrinsics to generic. (WRB)
  54. C 890618 Completely restructured and extensively revised (WRB & RWC)
  55. C 891214 Prologue converted to Version 4.0 format. (BAB)
  56. C 900328 Added TYPE section. (WRB)
  57. C 900604 DP version created from SP version. (RWC)
  58. C 920422 Changed CALL to DHFTI to include variable MA. (WRB)
  59. C***END PROLOGUE DLSI
  60. INTEGER IP(*), MA, MDW, MG, MODE, N
  61. DOUBLE PRECISION PRGOPT(*), RNORM, W(MDW,*), WS(*), X(*)
  62. C
  63. EXTERNAL D1MACH, DASUM, DAXPY, DCOPY, DDOT, DH12, DHFTI, DLPDP,
  64. * DSCAL, DSWAP
  65. DOUBLE PRECISION D1MACH, DASUM, DDOT
  66. C
  67. DOUBLE PRECISION ANORM, DRELPR, FAC, GAM, RB, TAU, TOL, XNORM
  68. INTEGER I, J, K, KEY, KRANK, KRM1, KRP1, L, LAST, LINK, M, MAP1,
  69. * MDLPDP, MINMAN, N1, N2, N3, NEXT, NP1
  70. LOGICAL COV, FIRST, SCLCOV
  71. C
  72. SAVE DRELPR, FIRST
  73. DATA FIRST /.TRUE./
  74. C
  75. C***FIRST EXECUTABLE STATEMENT DLSI
  76. C
  77. C Set the nominal tolerance used in the code.
  78. C
  79. IF (FIRST) DRELPR = D1MACH(4)
  80. FIRST = .FALSE.
  81. TOL = SQRT(DRELPR)
  82. C
  83. MODE = 0
  84. RNORM = 0.D0
  85. M = MA + MG
  86. NP1 = N + 1
  87. KRANK = 0
  88. IF (N.LE.0 .OR. M.LE.0) GO TO 370
  89. C
  90. C To process option vector.
  91. C
  92. COV = .FALSE.
  93. SCLCOV = .TRUE.
  94. LAST = 1
  95. LINK = PRGOPT(1)
  96. C
  97. 100 IF (LINK.GT.1) THEN
  98. KEY = PRGOPT(LAST+1)
  99. IF (KEY.EQ.1) COV = PRGOPT(LAST+2) .NE. 0.D0
  100. IF (KEY.EQ.10) SCLCOV = PRGOPT(LAST+2) .EQ. 0.D0
  101. IF (KEY.EQ.5) TOL = MAX(DRELPR,PRGOPT(LAST+2))
  102. NEXT = PRGOPT(LINK)
  103. LAST = LINK
  104. LINK = NEXT
  105. GO TO 100
  106. ENDIF
  107. C
  108. C Compute matrix norm of least squares equations.
  109. C
  110. ANORM = 0.D0
  111. DO 110 J = 1,N
  112. ANORM = MAX(ANORM,DASUM(MA,W(1,J),1))
  113. 110 CONTINUE
  114. C
  115. C Set tolerance for DHFTI( ) rank test.
  116. C
  117. TAU = TOL*ANORM
  118. C
  119. C Compute Householder orthogonal decomposition of matrix.
  120. C
  121. CALL DCOPY (N, 0.D0, 0, WS, 1)
  122. CALL DCOPY (MA, W(1, NP1), 1, WS, 1)
  123. K = MAX(M,N)
  124. MINMAN = MIN(MA,N)
  125. N1 = K + 1
  126. N2 = N1 + N
  127. CALL DHFTI (W, MDW, MA, N, WS, MA, 1, TAU, KRANK, RNORM, WS(N2),
  128. + WS(N1), IP)
  129. FAC = 1.D0
  130. GAM = MA - KRANK
  131. IF (KRANK.LT.MA .AND. SCLCOV) FAC = RNORM**2/GAM
  132. C
  133. C Reduce to DLPDP and solve.
  134. C
  135. MAP1 = MA + 1
  136. C
  137. C Compute inequality rt-hand side for DLPDP.
  138. C
  139. IF (MA.LT.M) THEN
  140. IF (MINMAN.GT.0) THEN
  141. DO 120 I = MAP1,M
  142. W(I,NP1) = W(I,NP1) - DDOT(N,W(I,1),MDW,WS,1)
  143. 120 CONTINUE
  144. C
  145. C Apply permutations to col. of inequality constraint matrix.
  146. C
  147. DO 130 I = 1,MINMAN
  148. CALL DSWAP (MG, W(MAP1,I), 1, W(MAP1,IP(I)), 1)
  149. 130 CONTINUE
  150. C
  151. C Apply Householder transformations to constraint matrix.
  152. C
  153. IF (KRANK.GT.0 .AND. KRANK.LT.N) THEN
  154. DO 140 I = KRANK,1,-1
  155. CALL DH12 (2, I, KRANK+1, N, W(I,1), MDW, WS(N1+I-1),
  156. + W(MAP1,1), MDW, 1, MG)
  157. 140 CONTINUE
  158. ENDIF
  159. C
  160. C Compute permuted inequality constraint matrix times r-inv.
  161. C
  162. DO 160 I = MAP1,M
  163. DO 150 J = 1,KRANK
  164. W(I,J) = (W(I,J)-DDOT(J-1,W(1,J),1,W(I,1),MDW))/W(J,J)
  165. 150 CONTINUE
  166. 160 CONTINUE
  167. ENDIF
  168. C
  169. C Solve the reduced problem with DLPDP algorithm,
  170. C the least projected distance problem.
  171. C
  172. CALL DLPDP(W(MAP1,1), MDW, MG, KRANK, N-KRANK, PRGOPT, X,
  173. + XNORM, MDLPDP, WS(N2), IP(N+1))
  174. C
  175. C Compute solution in original coordinates.
  176. C
  177. IF (MDLPDP.EQ.1) THEN
  178. DO 170 I = KRANK,1,-1
  179. X(I) = (X(I)-DDOT(KRANK-I,W(I,I+1),MDW,X(I+1),1))/W(I,I)
  180. 170 CONTINUE
  181. C
  182. C Apply Householder transformation to solution vector.
  183. C
  184. IF (KRANK.LT.N) THEN
  185. DO 180 I = 1,KRANK
  186. CALL DH12 (2, I, KRANK+1, N, W(I,1), MDW, WS(N1+I-1),
  187. + X, 1, 1, 1)
  188. 180 CONTINUE
  189. ENDIF
  190. C
  191. C Repermute variables to their input order.
  192. C
  193. IF (MINMAN.GT.0) THEN
  194. DO 190 I = MINMAN,1,-1
  195. CALL DSWAP (1, X(I), 1, X(IP(I)), 1)
  196. 190 CONTINUE
  197. C
  198. C Variables are now in original coordinates.
  199. C Add solution of unconstrained problem.
  200. C
  201. DO 200 I = 1,N
  202. X(I) = X(I) + WS(I)
  203. 200 CONTINUE
  204. C
  205. C Compute the residual vector norm.
  206. C
  207. RNORM = SQRT(RNORM**2+XNORM**2)
  208. ENDIF
  209. ELSE
  210. MODE = 2
  211. ENDIF
  212. ELSE
  213. CALL DCOPY (N, WS, 1, X, 1)
  214. ENDIF
  215. C
  216. C Compute covariance matrix based on the orthogonal decomposition
  217. C from DHFTI( ).
  218. C
  219. IF (.NOT.COV .OR. KRANK.LE.0) GO TO 370
  220. KRM1 = KRANK - 1
  221. KRP1 = KRANK + 1
  222. C
  223. C Copy diagonal terms to working array.
  224. C
  225. CALL DCOPY (KRANK, W, MDW+1, WS(N2), 1)
  226. C
  227. C Reciprocate diagonal terms.
  228. C
  229. DO 210 J = 1,KRANK
  230. W(J,J) = 1.D0/W(J,J)
  231. 210 CONTINUE
  232. C
  233. C Invert the upper triangular QR factor on itself.
  234. C
  235. IF (KRANK.GT.1) THEN
  236. DO 230 I = 1,KRM1
  237. DO 220 J = I+1,KRANK
  238. W(I,J) = -DDOT(J-I,W(I,I),MDW,W(I,J),1)*W(J,J)
  239. 220 CONTINUE
  240. 230 CONTINUE
  241. ENDIF
  242. C
  243. C Compute the inverted factor times its transpose.
  244. C
  245. DO 250 I = 1,KRANK
  246. DO 240 J = I,KRANK
  247. W(I,J) = DDOT(KRANK+1-J,W(I,J),MDW,W(J,J),MDW)
  248. 240 CONTINUE
  249. 250 CONTINUE
  250. C
  251. C Zero out lower trapezoidal part.
  252. C Copy upper triangular to lower triangular part.
  253. C
  254. IF (KRANK.LT.N) THEN
  255. DO 260 J = 1,KRANK
  256. CALL DCOPY (J, W(1,J), 1, W(J,1), MDW)
  257. 260 CONTINUE
  258. C
  259. DO 270 I = KRP1,N
  260. CALL DCOPY (I, 0.D0, 0, W(I,1), MDW)
  261. 270 CONTINUE
  262. C
  263. C Apply right side transformations to lower triangle.
  264. C
  265. N3 = N2 + KRP1
  266. DO 330 I = 1,KRANK
  267. L = N1 + I
  268. K = N2 + I
  269. RB = WS(L-1)*WS(K-1)
  270. C
  271. C If RB.GE.0.D0, transformation can be regarded as zero.
  272. C
  273. IF (RB.LT.0.D0) THEN
  274. RB = 1.D0/RB
  275. C
  276. C Store unscaled rank one Householder update in work array.
  277. C
  278. CALL DCOPY (N, 0.D0, 0, WS(N3), 1)
  279. L = N1 + I
  280. K = N3 + I
  281. WS(K-1) = WS(L-1)
  282. C
  283. DO 280 J = KRP1,N
  284. WS(N3+J-1) = W(I,J)
  285. 280 CONTINUE
  286. C
  287. DO 290 J = 1,N
  288. WS(J) = RB*(DDOT(J-I,W(J,I),MDW,WS(N3+I-1),1)+
  289. + DDOT(N-J+1,W(J,J),1,WS(N3+J-1),1))
  290. 290 CONTINUE
  291. C
  292. L = N3 + I
  293. GAM = 0.5D0*RB*DDOT(N-I+1,WS(L-1),1,WS(I),1)
  294. CALL DAXPY (N-I+1, GAM, WS(L-1), 1, WS(I), 1)
  295. DO 320 J = I,N
  296. DO 300 L = 1,I-1
  297. W(J,L) = W(J,L) + WS(N3+J-1)*WS(L)
  298. 300 CONTINUE
  299. C
  300. DO 310 L = I,J
  301. W(J,L) = W(J,L) + WS(J)*WS(N3+L-1)+WS(L)*WS(N3+J-1)
  302. 310 CONTINUE
  303. 320 CONTINUE
  304. ENDIF
  305. 330 CONTINUE
  306. C
  307. C Copy lower triangle to upper triangle to symmetrize the
  308. C covariance matrix.
  309. C
  310. DO 340 I = 1,N
  311. CALL DCOPY (I, W(I,1), MDW, W(1,I), 1)
  312. 340 CONTINUE
  313. ENDIF
  314. C
  315. C Repermute rows and columns.
  316. C
  317. DO 350 I = MINMAN,1,-1
  318. K = IP(I)
  319. IF (I.NE.K) THEN
  320. CALL DSWAP (1, W(I,I), 1, W(K,K), 1)
  321. CALL DSWAP (I-1, W(1,I), 1, W(1,K), 1)
  322. CALL DSWAP (K-I-1, W(I,I+1), MDW, W(I+1,K), 1)
  323. CALL DSWAP (N-K, W(I, K+1), MDW, W(K, K+1), MDW)
  324. ENDIF
  325. 350 CONTINUE
  326. C
  327. C Put in normalized residual sum of squares scale factor
  328. C and symmetrize the resulting covariance matrix.
  329. C
  330. DO 360 J = 1,N
  331. CALL DSCAL (J, FAC, W(1,J), 1)
  332. CALL DCOPY (J, W(1,J), 1, W(J,1), MDW)
  333. 360 CONTINUE
  334. C
  335. 370 IP(1) = KRANK
  336. IP(2) = N + MAX(M,N) + (MG+2)*(N+7)
  337. RETURN
  338. END