fcmn.f 11 KB

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