bspdr.f 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. *DECK BSPDR
  2. SUBROUTINE BSPDR (T, A, N, K, NDERIV, AD)
  3. C***BEGIN PROLOGUE BSPDR
  4. C***PURPOSE Use the B-representation to construct a divided difference
  5. C table preparatory to a (right) derivative calculation.
  6. C***LIBRARY SLATEC
  7. C***CATEGORY E3
  8. C***TYPE SINGLE PRECISION (BSPDR-S, DBSPDR-D)
  9. C***KEYWORDS B-SPLINE, DATA FITTING, DIFFERENTIATION OF SPLINES,
  10. C INTERPOLATION
  11. C***AUTHOR Amos, D. E., (SNLA)
  12. C***DESCRIPTION
  13. C
  14. C Written by Carl de Boor and modified by D. E. Amos
  15. C
  16. C Abstract
  17. C BSPDR is the BSPLDR routine of the reference.
  18. C
  19. C BSPDR uses the B-representation (T,A,N,K) to construct a
  20. C divided difference table ADIF preparatory to a (right)
  21. C derivative calculation in BSPEV. The lower triangular matrix
  22. C ADIF is stored in vector AD by columns. The arrays are
  23. C related by
  24. C
  25. C ADIF(I,J) = AD(I-J+1 + (2*N-J+2)*(J-1)/2)
  26. C
  27. C I = J,N , J = 1,NDERIV .
  28. C
  29. C Description of Arguments
  30. C Input
  31. C T - knot vector of length N+K
  32. C A - B-spline coefficient vector of length N
  33. C N - number of B-spline coefficients
  34. C N = sum of knot multiplicities-K
  35. C K - order of the spline, K .GE. 1
  36. C NDERIV - number of derivatives, 1 .LE. NDERIV .LE. K.
  37. C NDERIV=1 gives the zero-th derivative = function
  38. C value
  39. C
  40. C Output
  41. C AD - table of differences in a vector of length
  42. C (2*N-NDERIV+1)*NDERIV/2 for input to BSPEV
  43. C
  44. C Error Conditions
  45. C Improper input is a fatal error
  46. C
  47. C***REFERENCES Carl de Boor, Package for calculating with B-splines,
  48. C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
  49. C pp. 441-472.
  50. C***ROUTINES CALLED XERMSG
  51. C***REVISION HISTORY (YYMMDD)
  52. C 800901 DATE WRITTEN
  53. C 890831 Modified array declarations. (WRB)
  54. C 890831 REVISION DATE from Version 3.2
  55. C 891214 Prologue converted to Version 4.0 format. (BAB)
  56. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  57. C 900326 Removed duplicate information from DESCRIPTION section.
  58. C (WRB)
  59. C 920501 Reformatted the REFERENCES section. (WRB)
  60. C***END PROLOGUE BSPDR
  61. C
  62. INTEGER I, ID, II, IPKMID, JJ, JM, K, KMID, N, NDERIV
  63. REAL A, AD, DIFF, FKMID, T
  64. C DIMENSION T(N+K), AD((2*N-NDERIV+1)*NDERIV/2)
  65. DIMENSION T(*), A(*), AD(*)
  66. C***FIRST EXECUTABLE STATEMENT BSPDR
  67. IF(K.LT.1) GO TO 100
  68. IF(N.LT.K) GO TO 105
  69. IF(NDERIV.LT.1 .OR. NDERIV.GT.K) GO TO 110
  70. DO 10 I=1,N
  71. AD(I) = A(I)
  72. 10 CONTINUE
  73. IF (NDERIV.EQ.1) RETURN
  74. KMID = K
  75. JJ = N
  76. JM = 0
  77. DO 30 ID=2,NDERIV
  78. KMID = KMID - 1
  79. FKMID = KMID
  80. II = 1
  81. DO 20 I=ID,N
  82. IPKMID = I + KMID
  83. DIFF = T(IPKMID) - T(I)
  84. IF (DIFF.NE.0.0E0) AD(II+JJ) = (AD(II+JM+1)-AD(II+JM))/
  85. 1 DIFF*FKMID
  86. II = II + 1
  87. 20 CONTINUE
  88. JM = JJ
  89. JJ = JJ + N - ID + 1
  90. 30 CONTINUE
  91. RETURN
  92. C
  93. C
  94. 100 CONTINUE
  95. CALL XERMSG ('SLATEC', 'BSPDR', 'K DOES NOT SATISFY K.GE.1', 2,
  96. + 1)
  97. RETURN
  98. 105 CONTINUE
  99. CALL XERMSG ('SLATEC', 'BSPDR', 'N DOES NOT SATISFY N.GE.K', 2,
  100. + 1)
  101. RETURN
  102. 110 CONTINUE
  103. CALL XERMSG ('SLATEC', 'BSPDR',
  104. + 'NDERIV DOES NOT SATISFY 1.LE.NDERIV.LE.K', 2, 1)
  105. RETURN
  106. END