bspvd.f 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. *DECK BSPVD
  2. SUBROUTINE BSPVD (T, K, NDERIV, X, ILEFT, LDVNIK, VNIKX, WORK)
  3. C***BEGIN PROLOGUE BSPVD
  4. C***PURPOSE Calculate the value and all derivatives of order less than
  5. C NDERIV of all basis functions which do not vanish at X.
  6. C***LIBRARY SLATEC
  7. C***CATEGORY E3, K6
  8. C***TYPE SINGLE PRECISION (BSPVD-S, DBSPVD-D)
  9. C***KEYWORDS DIFFERENTIATION OF B-SPLINE, EVALUATION OF B-SPLINE
  10. C***AUTHOR Amos, D. E., (SNLA)
  11. C***DESCRIPTION
  12. C
  13. C Written by Carl de Boor and modified by D. E. Amos
  14. C
  15. C Abstract
  16. C BSPVD is the BSPLVD routine of the reference.
  17. C
  18. C BSPVD calculates the value and all derivatives of order
  19. C less than NDERIV of all basis functions which do not
  20. C (possibly) vanish at X. ILEFT is input such that
  21. C T(ILEFT) .LE. X .LT. T(ILEFT+1). A call to INTRV(T,N+1,X,
  22. C ILO,ILEFT,MFLAG) will produce the proper ILEFT. The output of
  23. C BSPVD is a matrix VNIKX(I,J) of dimension at least (K,NDERIV)
  24. C whose columns contain the K nonzero basis functions and
  25. C their NDERIV-1 right derivatives at X, I=1,K, J=1,NDERIV.
  26. C These basis functions have indices ILEFT-K+I, I=1,K,
  27. C K .LE. ILEFT .LE. N. The nonzero part of the I-th basis
  28. C function lies in (T(I),T(I+K)), I=1,N.
  29. C
  30. C If X=T(ILEFT+1) then VNIKX contains left limiting values
  31. C (left derivatives) at T(ILEFT+1). In particular, ILEFT = N
  32. C produces left limiting values at the right end point
  33. C X=T(N+1). To obtain left limiting values at T(I), I=K+1,N+1,
  34. C set X= next lower distinct knot, call INTRV to get ILEFT,
  35. C set X=T(I), and then call BSPVD.
  36. C
  37. C Description of Arguments
  38. C Input
  39. C T - knot vector of length N+K, where
  40. C N = number of B-spline basis functions
  41. C N = sum of knot multiplicities-K
  42. C K - order of the B-spline, K .GE. 1
  43. C NDERIV - number of derivatives = NDERIV-1,
  44. C 1 .LE. NDERIV .LE. K
  45. C X - argument of basis functions,
  46. C T(K) .LE. X .LE. T(N+1)
  47. C ILEFT - largest integer such that
  48. C T(ILEFT) .LE. X .LT. T(ILEFT+1)
  49. C LDVNIK - leading dimension of matrix VNIKX
  50. C
  51. C Output
  52. C VNIKX - matrix of dimension at least (K,NDERIV) contain-
  53. C ing the nonzero basis functions at X and their
  54. C derivatives columnwise.
  55. C WORK - a work vector of length (K+1)*(K+2)/2
  56. C
  57. C Error Conditions
  58. C Improper input is a fatal error
  59. C
  60. C***REFERENCES Carl de Boor, Package for calculating with B-splines,
  61. C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
  62. C pp. 441-472.
  63. C***ROUTINES CALLED BSPVN, XERMSG
  64. C***REVISION HISTORY (YYMMDD)
  65. C 800901 DATE WRITTEN
  66. C 890531 Changed all specific intrinsics to generic. (WRB)
  67. C 890831 Modified array declarations. (WRB)
  68. C 890831 REVISION DATE from Version 3.2
  69. C 891214 Prologue converted to Version 4.0 format. (BAB)
  70. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  71. C 900326 Removed duplicate information from DESCRIPTION section.
  72. C (WRB)
  73. C 920501 Reformatted the REFERENCES section. (WRB)
  74. C***END PROLOGUE BSPVD
  75. C
  76. INTEGER I,IDERIV,ILEFT,IPKMD,J,JJ,JLOW,JM,JP1MID,K,KMD, KP1, L,
  77. 1 LDUMMY, M, MHIGH, NDERIV
  78. REAL FACTOR, FKMD, T, V, VNIKX, WORK, X
  79. C DIMENSION T(ILEFT+K), WORK((K+1)*(K+2)/2)
  80. C A(I,J) = WORK(I+J*(J+1)/2), I=1,J+1 J=1,K-1
  81. C A(I,K) = W0RK(I+K*(K-1)/2) I=1.K
  82. C WORK(1) AND WORK((K+1)*(K+2)/2) ARE NOT USED.
  83. DIMENSION T(*), VNIKX(LDVNIK,*), WORK(*)
  84. C***FIRST EXECUTABLE STATEMENT BSPVD
  85. IF(K.LT.1) GO TO 200
  86. IF(NDERIV.LT.1 .OR. NDERIV.GT.K) GO TO 205
  87. IF(LDVNIK.LT.K) GO TO 210
  88. IDERIV = NDERIV
  89. KP1 = K + 1
  90. JJ = KP1 - IDERIV
  91. CALL BSPVN(T, JJ, K, 1, X, ILEFT, VNIKX, WORK, IWORK)
  92. IF (IDERIV.EQ.1) GO TO 100
  93. MHIGH = IDERIV
  94. DO 20 M=2,MHIGH
  95. JP1MID = 1
  96. DO 10 J=IDERIV,K
  97. VNIKX(J,IDERIV) = VNIKX(JP1MID,1)
  98. JP1MID = JP1MID + 1
  99. 10 CONTINUE
  100. IDERIV = IDERIV - 1
  101. JJ = KP1 - IDERIV
  102. CALL BSPVN(T, JJ, K, 2, X, ILEFT, VNIKX, WORK, IWORK)
  103. 20 CONTINUE
  104. C
  105. JM = KP1*(KP1+1)/2
  106. DO 30 L = 1,JM
  107. WORK(L) = 0.0E0
  108. 30 CONTINUE
  109. C A(I,I) = WORK(I*(I+3)/2) = 1.0 I = 1,K
  110. L = 2
  111. J = 0
  112. DO 40 I = 1,K
  113. J = J + L
  114. WORK(J) = 1.0E0
  115. L = L + 1
  116. 40 CONTINUE
  117. KMD = K
  118. DO 90 M=2,MHIGH
  119. KMD = KMD - 1
  120. FKMD = KMD
  121. I = ILEFT
  122. J = K
  123. JJ = J*(J+1)/2
  124. JM = JJ - J
  125. DO 60 LDUMMY=1,KMD
  126. IPKMD = I + KMD
  127. FACTOR = FKMD/(T(IPKMD)-T(I))
  128. DO 50 L=1,J
  129. WORK(L+JJ) = (WORK(L+JJ)-WORK(L+JM))*FACTOR
  130. 50 CONTINUE
  131. I = I - 1
  132. J = J - 1
  133. JJ = JM
  134. JM = JM - J
  135. 60 CONTINUE
  136. C
  137. DO 80 I=1,K
  138. V = 0.0E0
  139. JLOW = MAX(I,M)
  140. JJ = JLOW*(JLOW+1)/2
  141. DO 70 J=JLOW,K
  142. V = WORK(I+JJ)*VNIKX(J,M) + V
  143. JJ = JJ + J + 1
  144. 70 CONTINUE
  145. VNIKX(I,M) = V
  146. 80 CONTINUE
  147. 90 CONTINUE
  148. 100 RETURN
  149. C
  150. C
  151. 200 CONTINUE
  152. CALL XERMSG ('SLATEC', 'BSPVD', 'K DOES NOT SATISFY K.GE.1', 2,
  153. + 1)
  154. RETURN
  155. 205 CONTINUE
  156. CALL XERMSG ('SLATEC', 'BSPVD',
  157. + 'NDERIV DOES NOT SATISFY 1.LE.NDERIV.LE.K', 2, 1)
  158. RETURN
  159. 210 CONTINUE
  160. CALL XERMSG ('SLATEC', 'BSPVD',
  161. + 'LDVNIK DOES NOT SATISFY LDVNIK.GE.K', 2, 1)
  162. RETURN
  163. END