dfcmn.f 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. *DECK DFCMN
  2. SUBROUTINE DFCMN (NDATA, XDATA, YDATA, SDDATA, NORD, NBKPT,
  3. + BKPTIN, NCONST, XCONST, YCONST, NDERIV, MODE, COEFF, BF, XTEMP,
  4. + PTEMP, BKPT, G, MDG, W, MDW, WORK, IWORK)
  5. C***BEGIN PROLOGUE DFCMN
  6. C***SUBSIDIARY
  7. C***PURPOSE Subsidiary to FC
  8. C***LIBRARY SLATEC
  9. C***TYPE DOUBLE PRECISION (FCMN-S, DFCMN-D)
  10. C***AUTHOR (UNKNOWN)
  11. C***DESCRIPTION
  12. C
  13. C This is a companion subprogram to DFC( ).
  14. C The documentation for DFC( ) has complete usage instructions.
  15. C
  16. C***SEE ALSO DFC
  17. C***ROUTINES CALLED DAXPY, DBNDAC, DBNDSL, DCOPY, DFSPVD, DFSPVN,
  18. C DLSEI, DSCAL, DSORT, XERMSG
  19. C***REVISION HISTORY (YYMMDD)
  20. C 780801 DATE WRITTEN
  21. C 890531 Changed all specific intrinsics to generic. (WRB)
  22. C 890618 Completely restructured and extensively revised (WRB & RWC)
  23. C 891214 Prologue converted to Version 4.0 format. (BAB)
  24. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  25. C 900328 Added TYPE section. (WRB)
  26. C 900510 Convert XERRWV calls to XERMSG calls. (RWC)
  27. C 900604 DP version created from SP version. (RWC)
  28. C***END PROLOGUE DFCMN
  29. INTEGER IWORK(*), MDG, MDW, MODE, NBKPT, NCONST, NDATA, NDERIV(*),
  30. * NORD
  31. DOUBLE PRECISION BF(NORD,*), BKPT(*), BKPTIN(*), COEFF(*),
  32. * G(MDG,*), PTEMP(*), SDDATA(*), W(MDW,*), WORK(*),
  33. * XCONST(*), XDATA(*), XTEMP(*), YCONST(*), YDATA(*)
  34. C
  35. EXTERNAL DAXPY, DBNDAC, DBNDSL, DCOPY, DFSPVD, DFSPVN, DLSEI,
  36. * DSCAL, DSORT, XERMSG
  37. C
  38. DOUBLE PRECISION DUMMY, PRGOPT(10), RNORM, RNORME, RNORML, XMAX,
  39. * XMIN, XVAL, YVAL
  40. INTEGER I, IDATA, IDERIV, ILEFT, INTRVL, INTW1, IP, IR, IROW,
  41. * ITYPE, IW1, IW2, L, LW, MT, N, NB, NEQCON, NINCON, NORDM1,
  42. * NORDP1, NP1
  43. LOGICAL BAND, NEW, VAR
  44. CHARACTER*8 XERN1
  45. C
  46. C***FIRST EXECUTABLE STATEMENT DFCMN
  47. C
  48. C Analyze input.
  49. C
  50. IF (NORD.LT.1 .OR. NORD.GT.20) THEN
  51. CALL XERMSG ('SLATEC', 'DFCMN',
  52. + 'IN DFC, THE ORDER OF THE B-SPLINE MUST BE 1 THRU 20.',
  53. + 2, 1)
  54. MODE = -1
  55. RETURN
  56. C
  57. ELSEIF (NBKPT.LT.2*NORD) THEN
  58. CALL XERMSG ('SLATEC', 'DFCMN',
  59. + 'IN DFC, THE NUMBER OF KNOTS MUST BE AT LEAST TWICE ' //
  60. + 'THE B-SPLINE ORDER.', 2, 1)
  61. MODE = -1
  62. RETURN
  63. ENDIF
  64. C
  65. IF (NDATA.LT.0) THEN
  66. CALL XERMSG ('SLATEC', 'DFCMN',
  67. + 'IN DFC, THE NUMBER OF DATA POINTS MUST BE NONNEGATIVE.',
  68. + 2, 1)
  69. MODE = -1
  70. RETURN
  71. ENDIF
  72. C
  73. C Amount of storage allocated for W(*), IW(*).
  74. C
  75. IW1 = IWORK(1)
  76. IW2 = IWORK(2)
  77. NB = (NBKPT-NORD+3)*(NORD+1) + 2*MAX(NDATA,NBKPT) + NBKPT +
  78. + NORD**2
  79. C
  80. C See if sufficient storage has been allocated.
  81. C
  82. IF (IW1.LT.NB) THEN
  83. WRITE (XERN1, '(I8)') NB
  84. CALL XERMSG ('SLATEC', 'DFCMN',
  85. * 'IN DFC, INSUFFICIENT STORAGE FOR W(*). CHECK NB = ' //
  86. * XERN1, 2, 1)
  87. MODE = -1
  88. RETURN
  89. ENDIF
  90. C
  91. IF (MODE.EQ.1) THEN
  92. BAND = .TRUE.
  93. VAR = .FALSE.
  94. NEW = .TRUE.
  95. ELSEIF (MODE.EQ.2) THEN
  96. BAND = .FALSE.
  97. VAR = .TRUE.
  98. NEW = .TRUE.
  99. ELSEIF (MODE.EQ.3) THEN
  100. BAND = .TRUE.
  101. VAR = .FALSE.
  102. NEW = .FALSE.
  103. ELSEIF (MODE.EQ.4) THEN
  104. BAND = .FALSE.
  105. VAR = .TRUE.
  106. NEW = .FALSE.
  107. ELSE
  108. CALL XERMSG ('SLATEC', 'DFCMN',
  109. + 'IN DFC, INPUT VALUE OF MODE MUST BE 1-4.', 2, 1)
  110. MODE = -1
  111. RETURN
  112. ENDIF
  113. MODE = 0
  114. C
  115. C Sort the breakpoints.
  116. C
  117. CALL DCOPY (NBKPT, BKPTIN, 1, BKPT, 1)
  118. CALL DSORT (BKPT, DUMMY, NBKPT, 1)
  119. C
  120. C Initialize variables.
  121. C
  122. NEQCON = 0
  123. NINCON = 0
  124. DO 100 I = 1,NCONST
  125. L = NDERIV(I)
  126. ITYPE = MOD(L,4)
  127. IF (ITYPE.LT.2) THEN
  128. NINCON = NINCON + 1
  129. ELSE
  130. NEQCON = NEQCON + 1
  131. ENDIF
  132. 100 CONTINUE
  133. C
  134. C Compute the number of variables.
  135. C
  136. N = NBKPT - NORD
  137. NP1 = N + 1
  138. LW = NB + (NP1+NCONST)*NP1 + 2*(NEQCON+NP1) + (NINCON+NP1) +
  139. + (NINCON+2)*(NP1+6)
  140. INTW1 = NINCON + 2*NP1
  141. C
  142. C Save interval containing knots.
  143. C
  144. XMIN = BKPT(NORD)
  145. XMAX = BKPT(NP1)
  146. C
  147. C Find the smallest referenced independent variable value in any
  148. C constraint.
  149. C
  150. DO 110 I = 1,NCONST
  151. XMIN = MIN(XMIN,XCONST(I))
  152. XMAX = MAX(XMAX,XCONST(I))
  153. 110 CONTINUE
  154. NORDM1 = NORD - 1
  155. NORDP1 = NORD + 1
  156. C
  157. C Define the option vector PRGOPT(1-10) for use in DLSEI( ).
  158. C
  159. PRGOPT(1) = 4
  160. C
  161. C Set the covariance matrix computation flag.
  162. C
  163. PRGOPT(2) = 1
  164. IF (VAR) THEN
  165. PRGOPT(3) = 1
  166. ELSE
  167. PRGOPT(3) = 0
  168. ENDIF
  169. C
  170. C Increase the rank determination tolerances for both equality
  171. C constraint equations and least squares equations.
  172. C
  173. PRGOPT(4) = 7
  174. PRGOPT(5) = 4
  175. PRGOPT(6) = 1.D-4
  176. C
  177. PRGOPT(7) = 10
  178. PRGOPT(8) = 5
  179. PRGOPT(9) = 1.D-4
  180. C
  181. PRGOPT(10) = 1
  182. C
  183. C Turn off work array length checking in DLSEI( ).
  184. C
  185. IWORK(1) = 0
  186. IWORK(2) = 0
  187. C
  188. C Initialize variables and analyze input.
  189. C
  190. IF (NEW) THEN
  191. C
  192. C To process least squares equations sort data and an array of
  193. C pointers.
  194. C
  195. CALL DCOPY (NDATA, XDATA, 1, XTEMP, 1)
  196. DO 120 I = 1,NDATA
  197. PTEMP(I) = I
  198. 120 CONTINUE
  199. C
  200. IF (NDATA.GT.0) THEN
  201. CALL DSORT (XTEMP, PTEMP, NDATA, 2)
  202. XMIN = MIN(XMIN,XTEMP(1))
  203. XMAX = MAX(XMAX,XTEMP(NDATA))
  204. ENDIF
  205. C
  206. C Fix breakpoint array if needed.
  207. C
  208. DO 130 I = 1,NORD
  209. BKPT(I) = MIN(BKPT(I),XMIN)
  210. 130 CONTINUE
  211. C
  212. DO 140 I = NP1,NBKPT
  213. BKPT(I) = MAX(BKPT(I),XMAX)
  214. 140 CONTINUE
  215. C
  216. C Initialize parameters of banded matrix processor, DBNDAC( ).
  217. C
  218. MT = 0
  219. IP = 1
  220. IR = 1
  221. ILEFT = NORD
  222. DO 160 IDATA = 1,NDATA
  223. C
  224. C Sorted indices are in PTEMP(*).
  225. C
  226. L = PTEMP(IDATA)
  227. XVAL = XDATA(L)
  228. C
  229. C When interval changes, process equations in the last block.
  230. C
  231. IF (XVAL.GE.BKPT(ILEFT+1)) THEN
  232. CALL DBNDAC (G, MDG, NORD, IP, IR, MT, ILEFT-NORDM1)
  233. MT = 0
  234. C
  235. C Move pointer up to have BKPT(ILEFT).LE.XVAL,
  236. C ILEFT.LT.NP1.
  237. C
  238. 150 IF (XVAL.GE.BKPT(ILEFT+1) .AND. ILEFT.LT.N) THEN
  239. ILEFT = ILEFT + 1
  240. GO TO 150
  241. ENDIF
  242. ENDIF
  243. C
  244. C Obtain B-spline function value.
  245. C
  246. CALL DFSPVN (BKPT, NORD, 1, XVAL, ILEFT, BF)
  247. C
  248. C Move row into place.
  249. C
  250. IROW = IR + MT
  251. MT = MT + 1
  252. CALL DCOPY (NORD, BF, 1, G(IROW,1), MDG)
  253. G(IROW,NORDP1) = YDATA(L)
  254. C
  255. C Scale data if uncertainty is nonzero.
  256. C
  257. IF (SDDATA(L).NE.0.D0) CALL DSCAL (NORDP1, 1.D0/SDDATA(L),
  258. + G(IROW,1), MDG)
  259. C
  260. C When staging work area is exhausted, process rows.
  261. C
  262. IF (IROW.EQ.MDG-1) THEN
  263. CALL DBNDAC (G, MDG, NORD, IP, IR, MT, ILEFT-NORDM1)
  264. MT = 0
  265. ENDIF
  266. 160 CONTINUE
  267. C
  268. C Process last block of equations.
  269. C
  270. CALL DBNDAC (G, MDG, NORD, IP, IR, MT, ILEFT-NORDM1)
  271. C
  272. C Last call to adjust block positioning.
  273. C
  274. CALL DCOPY (NORDP1, 0.D0, 0, G(IR,1), MDG)
  275. CALL DBNDAC (G, MDG, NORD, IP, IR, 1, NP1)
  276. ENDIF
  277. C
  278. BAND = BAND .AND. NCONST.EQ.0
  279. DO 170 I = 1,N
  280. BAND = BAND .AND. G(I,1).NE.0.D0
  281. 170 CONTINUE
  282. C
  283. C Process banded least squares equations.
  284. C
  285. IF (BAND) THEN
  286. CALL DBNDSL (1, G, MDG, NORD, IP, IR, COEFF, N, RNORM)
  287. RETURN
  288. ENDIF
  289. C
  290. C Check further for sufficient storage in working arrays.
  291. C
  292. IF (IW1.LT.LW) THEN
  293. WRITE (XERN1, '(I8)') LW
  294. CALL XERMSG ('SLATEC', 'DFCMN',
  295. * 'IN DFC, INSUFFICIENT STORAGE FOR W(*). CHECK LW = ' //
  296. * XERN1, 2, 1)
  297. MODE = -1
  298. RETURN
  299. ENDIF
  300. C
  301. IF (IW2.LT.INTW1) THEN
  302. WRITE (XERN1, '(I8)') INTW1
  303. CALL XERMSG ('SLATEC', 'DFCMN',
  304. * 'IN DFC, INSUFFICIENT STORAGE FOR IW(*). CHECK IW1 = ' //
  305. * XERN1, 2, 1)
  306. MODE = -1
  307. RETURN
  308. ENDIF
  309. C
  310. C Write equality constraints.
  311. C Analyze constraint indicators for an equality constraint.
  312. C
  313. NEQCON = 0
  314. DO 220 IDATA = 1,NCONST
  315. L = NDERIV(IDATA)
  316. ITYPE = MOD(L,4)
  317. IF (ITYPE.GT.1) THEN
  318. IDERIV = L/4
  319. NEQCON = NEQCON + 1
  320. ILEFT = NORD
  321. XVAL = XCONST(IDATA)
  322. C
  323. 180 IF (XVAL.LT.BKPT(ILEFT+1) .OR. ILEFT.GE.N) GO TO 190
  324. ILEFT = ILEFT + 1
  325. GO TO 180
  326. C
  327. 190 CALL DFSPVD (BKPT, NORD, XVAL, ILEFT, BF, IDERIV+1)
  328. CALL DCOPY (NP1, 0.D0, 0, W(NEQCON,1), MDW)
  329. CALL DCOPY (NORD, BF(1,IDERIV+1), 1, W(NEQCON,ILEFT-NORDM1),
  330. + MDW)
  331. C
  332. IF (ITYPE.EQ.2) THEN
  333. W(NEQCON,NP1) = YCONST(IDATA)
  334. ELSE
  335. ILEFT = NORD
  336. YVAL = YCONST(IDATA)
  337. C
  338. 200 IF (YVAL.LT.BKPT(ILEFT+1) .OR. ILEFT.GE.N) GO TO 210
  339. ILEFT = ILEFT + 1
  340. GO TO 200
  341. C
  342. 210 CALL DFSPVD (BKPT, NORD, YVAL, ILEFT, BF, IDERIV+1)
  343. CALL DAXPY (NORD, -1.D0, BF(1, IDERIV+1), 1,
  344. + W(NEQCON, ILEFT-NORDM1), MDW)
  345. ENDIF
  346. ENDIF
  347. 220 CONTINUE
  348. C
  349. C Transfer least squares data.
  350. C
  351. DO 230 I = 1,NP1
  352. IROW = I + NEQCON
  353. CALL DCOPY (N, 0.D0, 0, W(IROW,1), MDW)
  354. CALL DCOPY (MIN(NP1-I, NORD), G(I,1), MDG, W(IROW,I), MDW)
  355. W(IROW,NP1) = G(I,NORDP1)
  356. 230 CONTINUE
  357. C
  358. C Write inequality constraints.
  359. C Analyze constraint indicators for inequality constraints.
  360. C
  361. NINCON = 0
  362. DO 260 IDATA = 1,NCONST
  363. L = NDERIV(IDATA)
  364. ITYPE = MOD(L,4)
  365. IF (ITYPE.LT.2) THEN
  366. IDERIV = L/4
  367. NINCON = NINCON + 1
  368. ILEFT = NORD
  369. XVAL = XCONST(IDATA)
  370. C
  371. 240 IF (XVAL.LT.BKPT(ILEFT+1) .OR. ILEFT.GE.N) GO TO 250
  372. ILEFT = ILEFT + 1
  373. GO TO 240
  374. C
  375. 250 CALL DFSPVD (BKPT, NORD, XVAL, ILEFT, BF, IDERIV+1)
  376. IROW = NEQCON + NP1 + NINCON
  377. CALL DCOPY (N, 0.D0, 0, W(IROW,1), MDW)
  378. INTRVL = ILEFT - NORDM1
  379. CALL DCOPY (NORD, BF(1, IDERIV+1), 1, W(IROW, INTRVL), MDW)
  380. C
  381. IF (ITYPE.EQ.1) THEN
  382. W(IROW,NP1) = YCONST(IDATA)
  383. ELSE
  384. W(IROW,NP1) = -YCONST(IDATA)
  385. CALL DSCAL (NORD, -1.D0, W(IROW, INTRVL), MDW)
  386. ENDIF
  387. ENDIF
  388. 260 CONTINUE
  389. C
  390. C Solve constrained least squares equations.
  391. C
  392. CALL DLSEI(W, MDW, NEQCON, NP1, NINCON, N, PRGOPT, COEFF, RNORME,
  393. + RNORML, MODE, WORK, IWORK)
  394. RETURN
  395. END