dbint4.f 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. *DECK DBINT4
  2. SUBROUTINE DBINT4 (X, Y, NDATA, IBCL, IBCR, FBCL, FBCR, KNTOPT, T,
  3. + BCOEF, N, K, W)
  4. C***BEGIN PROLOGUE DBINT4
  5. C***PURPOSE Compute the B-representation of a cubic spline
  6. C which interpolates given data.
  7. C***LIBRARY SLATEC
  8. C***CATEGORY E1A
  9. C***TYPE DOUBLE PRECISION (BINT4-S, DBINT4-D)
  10. C***KEYWORDS B-SPLINE, CUBIC SPLINES, DATA FITTING, INTERPOLATION
  11. C***AUTHOR Amos, D. E., (SNLA)
  12. C***DESCRIPTION
  13. C
  14. C Abstract **** a double precision routine ****
  15. C
  16. C DBINT4 computes the B representation (T,BCOEF,N,K) of a
  17. C cubic spline (K=4) which interpolates data (X(I),Y(I)),
  18. C I=1,NDATA. Parameters IBCL, IBCR, FBCL, FBCR allow the
  19. C specification of the spline first or second derivative at
  20. C both X(1) and X(NDATA). When this data is not specified
  21. C by the problem, it is common practice to use a natural
  22. C spline by setting second derivatives at X(1) and X(NDATA)
  23. C to zero (IBCL=IBCR=2,FBCL=FBCR=0.0). The spline is defined
  24. C on T(4) .LE. X .LE. T(N+1) with (ordered) interior knots at
  25. C X(I) values where N=NDATA+2. The knots T(1),T(2),T(3) lie to
  26. C the left of T(4)=X(1) and the knots T(N+2), T(N+3), T(N+4)
  27. C lie to the right of T(N+1)=X(NDATA) in increasing order. If
  28. C no extrapolation outside (X(1),X(NDATA)) is anticipated, the
  29. C knots T(1)=T(2)=T(3)=T(4)=X(1) and T(N+2)=T(N+3)=T(N+4)=
  30. C T(N+1)=X(NDATA) can be specified by KNTOPT=1. KNTOPT=2
  31. C selects a knot placement for T(1), T(2), T(3) to make the
  32. C first 7 knots symmetric about T(4)=X(1) and similarly for
  33. C T(N+2), T(N+3), T(N+4) about T(N+1)=X(NDATA). KNTOPT=3
  34. C allows the user to make his own selection, in increasing
  35. C order, for T(1), T(2), T(3) to the left of X(1) and T(N+2),
  36. C T(N+3), T(N+4) to the right of X(NDATA) in the work array
  37. C W(1) through W(6). In any case, the interpolation on
  38. C T(4) .LE. X .LE. T(N+1) by using function DBVALU is unique
  39. C for given boundary conditions.
  40. C
  41. C Description of Arguments
  42. C
  43. C Input X,Y,FBCL,FBCR,W are double precision
  44. C X - X vector of abscissae of length NDATA, distinct
  45. C and in increasing order
  46. C Y - Y vector of ordinates of length NDATA
  47. C NDATA - number of data points, NDATA .GE. 2
  48. C IBCL - selection parameter for left boundary condition
  49. C IBCL = 1 constrain the first derivative at
  50. C X(1) to FBCL
  51. C = 2 constrain the second derivative at
  52. C X(1) to FBCL
  53. C IBCR - selection parameter for right boundary condition
  54. C IBCR = 1 constrain first derivative at
  55. C X(NDATA) to FBCR
  56. C IBCR = 2 constrain second derivative at
  57. C X(NDATA) to FBCR
  58. C FBCL - left boundary values governed by IBCL
  59. C FBCR - right boundary values governed by IBCR
  60. C KNTOPT - knot selection parameter
  61. C KNTOPT = 1 sets knot multiplicity at T(4) and
  62. C T(N+1) to 4
  63. C = 2 sets a symmetric placement of knots
  64. C about T(4) and T(N+1)
  65. C = 3 sets T(I)=W(I) and T(N+1+I)=W(3+I),I=1,3
  66. C where W(I),I=1,6 is supplied by the user
  67. C W - work array of dimension at least 5*(NDATA+2)
  68. C If KNTOPT=3, then W(1),W(2),W(3) are knot values to
  69. C the left of X(1) and W(4),W(5),W(6) are knot
  70. C values to the right of X(NDATA) in increasing
  71. C order to be supplied by the user
  72. C
  73. C Output T,BCOEF are double precision
  74. C T - knot array of length N+4
  75. C BCOEF - B spline coefficient array of length N
  76. C N - number of coefficients, N=NDATA+2
  77. C K - order of spline, K=4
  78. C
  79. C Error Conditions
  80. C Improper input is a fatal error
  81. C Singular system of equations is a fatal error
  82. C
  83. C***REFERENCES D. E. Amos, Computation with splines and B-splines,
  84. C Report SAND78-1968, Sandia Laboratories, March 1979.
  85. C Carl de Boor, Package for calculating with B-splines,
  86. C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
  87. C pp. 441-472.
  88. C Carl de Boor, A Practical Guide to Splines, Applied
  89. C Mathematics Series 27, Springer-Verlag, New York,
  90. C 1978.
  91. C***ROUTINES CALLED D1MACH, DBNFAC, DBNSLV, DBSPVD, XERMSG
  92. C***REVISION HISTORY (YYMMDD)
  93. C 800901 DATE WRITTEN
  94. C 890531 Changed all specific intrinsics to generic. (WRB)
  95. C 890531 REVISION DATE from Version 3.2
  96. C 891214 Prologue converted to Version 4.0 format. (BAB)
  97. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  98. C 900326 Removed duplicate information from DESCRIPTION section.
  99. C (WRB)
  100. C 920501 Reformatted the REFERENCES section. (WRB)
  101. C***END PROLOGUE DBINT4
  102. C
  103. INTEGER I, IBCL, IBCR, IFLAG, ILB, ILEFT, IT, IUB, IW, IWP, J,
  104. 1 JW, K, KNTOPT, N, NDATA, NDM, NP, NWROW
  105. DOUBLE PRECISION BCOEF,FBCL,FBCR,T,TOL,TXN,TX1,VNIKX,W,WDTOL,
  106. 1 WORK,X,XL,Y
  107. DOUBLE PRECISION D1MACH
  108. DIMENSION X(*), Y(*), T(*), BCOEF(*), W(5,*), VNIKX(4,4), WORK(15)
  109. C***FIRST EXECUTABLE STATEMENT DBINT4
  110. WDTOL = D1MACH(4)
  111. TOL = SQRT(WDTOL)
  112. IF (NDATA.LT.2) GO TO 200
  113. NDM = NDATA - 1
  114. DO 10 I=1,NDM
  115. IF (X(I).GE.X(I+1)) GO TO 210
  116. 10 CONTINUE
  117. IF (IBCL.LT.1 .OR. IBCL.GT.2) GO TO 220
  118. IF (IBCR.LT.1 .OR. IBCR.GT.2) GO TO 230
  119. IF (KNTOPT.LT.1 .OR. KNTOPT.GT.3) GO TO 240
  120. K = 4
  121. N = NDATA + 2
  122. NP = N + 1
  123. DO 20 I=1,NDATA
  124. T(I+3) = X(I)
  125. 20 CONTINUE
  126. GO TO (30, 50, 90), KNTOPT
  127. C SET UP KNOT ARRAY WITH MULTIPLICITY 4 AT X(1) AND X(NDATA)
  128. 30 CONTINUE
  129. DO 40 I=1,3
  130. T(4-I) = X(1)
  131. T(NP+I) = X(NDATA)
  132. 40 CONTINUE
  133. GO TO 110
  134. C SET UP KNOT ARRAY WITH SYMMETRIC PLACEMENT ABOUT END POINTS
  135. 50 CONTINUE
  136. IF (NDATA.GT.3) GO TO 70
  137. XL = (X(NDATA)-X(1))/3.0D0
  138. DO 60 I=1,3
  139. T(4-I) = T(5-I) - XL
  140. T(NP+I) = T(NP+I-1) + XL
  141. 60 CONTINUE
  142. GO TO 110
  143. 70 CONTINUE
  144. TX1 = X(1) + X(1)
  145. TXN = X(NDATA) + X(NDATA)
  146. DO 80 I=1,3
  147. T(4-I) = TX1 - X(I+1)
  148. T(NP+I) = TXN - X(NDATA-I)
  149. 80 CONTINUE
  150. GO TO 110
  151. C SET UP KNOT ARRAY LESS THAN X(1) AND GREATER THAN X(NDATA) TO BE
  152. C SUPPLIED BY USER IN WORK LOCATIONS W(1) THROUGH W(6) WHEN KNTOPT=3
  153. 90 CONTINUE
  154. DO 100 I=1,3
  155. T(4-I) = W(4-I,1)
  156. JW = MAX(1,I-1)
  157. IW = MOD(I+2,5)+1
  158. T(NP+I) = W(IW,JW)
  159. IF (T(4-I).GT.T(5-I)) GO TO 250
  160. IF (T(NP+I).LT.T(NP+I-1)) GO TO 250
  161. 100 CONTINUE
  162. 110 CONTINUE
  163. C
  164. DO 130 I=1,5
  165. DO 120 J=1,N
  166. W(I,J) = 0.0D0
  167. 120 CONTINUE
  168. 130 CONTINUE
  169. C SET UP LEFT INTERPOLATION POINT AND LEFT BOUNDARY CONDITION FOR
  170. C RIGHT LIMITS
  171. IT = IBCL + 1
  172. CALL DBSPVD(T, K, IT, X(1), K, 4, VNIKX, WORK)
  173. IW = 0
  174. IF (ABS(VNIKX(3,1)).LT.TOL) IW = 1
  175. DO 140 J=1,3
  176. W(J+1,4-J) = VNIKX(4-J,IT)
  177. W(J,4-J) = VNIKX(4-J,1)
  178. 140 CONTINUE
  179. BCOEF(1) = Y(1)
  180. BCOEF(2) = FBCL
  181. C SET UP INTERPOLATION EQUATIONS FOR POINTS I=2 TO I=NDATA-1
  182. ILEFT = 4
  183. IF (NDM.LT.2) GO TO 170
  184. DO 160 I=2,NDM
  185. ILEFT = ILEFT + 1
  186. CALL DBSPVD(T, K, 1, X(I), ILEFT, 4, VNIKX, WORK)
  187. DO 150 J=1,3
  188. W(J+1,3+I-J) = VNIKX(4-J,1)
  189. 150 CONTINUE
  190. BCOEF(I+1) = Y(I)
  191. 160 CONTINUE
  192. C SET UP RIGHT INTERPOLATION POINT AND RIGHT BOUNDARY CONDITION FOR
  193. C LEFT LIMITS(ILEFT IS ASSOCIATED WITH T(N)=X(NDATA-1))
  194. 170 CONTINUE
  195. IT = IBCR + 1
  196. CALL DBSPVD(T, K, IT, X(NDATA), ILEFT, 4, VNIKX, WORK)
  197. JW = 0
  198. IF (ABS(VNIKX(2,1)).LT.TOL) JW = 1
  199. DO 180 J=1,3
  200. W(J+1,3+NDATA-J) = VNIKX(5-J,IT)
  201. W(J+2,3+NDATA-J) = VNIKX(5-J,1)
  202. 180 CONTINUE
  203. BCOEF(N-1) = FBCR
  204. BCOEF(N) = Y(NDATA)
  205. C SOLVE SYSTEM OF EQUATIONS
  206. ILB = 2 - JW
  207. IUB = 2 - IW
  208. NWROW = 5
  209. IWP = IW + 1
  210. CALL DBNFAC(W(IWP,1), NWROW, N, ILB, IUB, IFLAG)
  211. IF (IFLAG.EQ.2) GO TO 190
  212. CALL DBNSLV(W(IWP,1), NWROW, N, ILB, IUB, BCOEF)
  213. RETURN
  214. C
  215. C
  216. 190 CONTINUE
  217. CALL XERMSG ('SLATEC', 'DBINT4',
  218. + 'THE SYSTEM OF EQUATIONS IS SINGULAR', 2, 1)
  219. RETURN
  220. 200 CONTINUE
  221. CALL XERMSG ('SLATEC', 'DBINT4', 'NDATA IS LESS THAN 2', 2, 1)
  222. RETURN
  223. 210 CONTINUE
  224. CALL XERMSG ('SLATEC', 'DBINT4',
  225. + 'X VALUES ARE NOT DISTINCT OR NOT ORDERED', 2, 1)
  226. RETURN
  227. 220 CONTINUE
  228. CALL XERMSG ('SLATEC', 'DBINT4', 'IBCL IS NOT 1 OR 2', 2, 1)
  229. RETURN
  230. 230 CONTINUE
  231. CALL XERMSG ('SLATEC', 'DBINT4', 'IBCR IS NOT 1 OR 2', 2, 1)
  232. RETURN
  233. 240 CONTINUE
  234. CALL XERMSG ('SLATEC', 'DBINT4', 'KNTOPT IS NOT 1, 2, OR 3', 2,
  235. + 1)
  236. RETURN
  237. 250 CONTINUE
  238. CALL XERMSG ('SLATEC', 'DBINT4',
  239. + 'KNOT INPUT THROUGH W ARRAY IS NOT ORDERED PROPERLY', 2, 1)
  240. RETURN
  241. END