dbvalu.f 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. *DECK DBVALU
  2. DOUBLE PRECISION FUNCTION DBVALU (T, A, N, K, IDERIV, X, INBV,
  3. + WORK)
  4. C***BEGIN PROLOGUE DBVALU
  5. C***PURPOSE Evaluate the B-representation of a B-spline at X for the
  6. C function value or any of its derivatives.
  7. C***LIBRARY SLATEC
  8. C***CATEGORY E3, K6
  9. C***TYPE DOUBLE PRECISION (BVALU-S, DBVALU-D)
  10. C***KEYWORDS DIFFERENTIATION OF B-SPLINE, EVALUATION OF B-SPLINE
  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 **** a double precision routine ****
  17. C DBVALU is the BVALUE function of the reference.
  18. C
  19. C DBVALU evaluates the B-representation (T,A,N,K) of a B-spline
  20. C at X for the function value on IDERIV=0 or any of its
  21. C derivatives on IDERIV=1,2,...,K-1. Right limiting values
  22. C (right derivatives) are returned except at the right end
  23. C point X=T(N+1) where left limiting values are computed. The
  24. C spline is defined on T(K) .LE. X .LE. T(N+1). DBVALU returns
  25. C a fatal error message when X is outside of this interval.
  26. C
  27. C To compute left derivatives or left limiting values at a
  28. C knot T(I), replace N by I-1 and set X=T(I), I=K+1,N+1.
  29. C
  30. C DBVALU calls DINTRV
  31. C
  32. C Description of Arguments
  33. C
  34. C Input T,A,X are double precision
  35. C T - knot vector of length N+K
  36. C A - B-spline coefficient vector of length N
  37. C N - number of B-spline coefficients
  38. C N = sum of knot multiplicities-K
  39. C K - order of the B-spline, K .GE. 1
  40. C IDERIV - order of the derivative, 0 .LE. IDERIV .LE. K-1
  41. C IDERIV = 0 returns the B-spline value
  42. C X - argument, T(K) .LE. X .LE. T(N+1)
  43. C INBV - an initialization parameter which must be set
  44. C to 1 the first time DBVALU is called.
  45. C
  46. C Output WORK,DBVALU are double precision
  47. C INBV - INBV contains information for efficient process-
  48. C ing after the initial call and INBV must not
  49. C be changed by the user. Distinct splines require
  50. C distinct INBV parameters.
  51. C WORK - work vector of length 3*K.
  52. C DBVALU - value of the IDERIV-th derivative at X
  53. C
  54. C Error Conditions
  55. C An improper input is a fatal error
  56. C
  57. C***REFERENCES Carl de Boor, Package for calculating with B-splines,
  58. C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
  59. C pp. 441-472.
  60. C***ROUTINES CALLED DINTRV, XERMSG
  61. C***REVISION HISTORY (YYMMDD)
  62. C 800901 DATE WRITTEN
  63. C 890831 Modified array declarations. (WRB)
  64. C 890911 Removed unnecessary intrinsics. (WRB)
  65. C 890911 REVISION DATE from Version 3.2
  66. C 891214 Prologue converted to Version 4.0 format. (BAB)
  67. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  68. C 920501 Reformatted the REFERENCES section. (WRB)
  69. C***END PROLOGUE DBVALU
  70. C
  71. INTEGER I,IDERIV,IDERP1,IHI,IHMKMJ,ILO,IMK,IMKPJ, INBV, IPJ,
  72. 1 IP1, IP1MJ, J, JJ, J1, J2, K, KMIDER, KMJ, KM1, KPK, MFLAG, N
  73. DOUBLE PRECISION A, FKMJ, T, WORK, X
  74. DIMENSION T(*), A(*), WORK(*)
  75. C***FIRST EXECUTABLE STATEMENT DBVALU
  76. DBVALU = 0.0D0
  77. IF(K.LT.1) GO TO 102
  78. IF(N.LT.K) GO TO 101
  79. IF(IDERIV.LT.0 .OR. IDERIV.GE.K) GO TO 110
  80. KMIDER = K - IDERIV
  81. C
  82. C *** FIND *I* IN (K,N) SUCH THAT T(I) .LE. X .LT. T(I+1)
  83. C (OR, .LE. T(I+1) IF T(I) .LT. T(I+1) = T(N+1)).
  84. KM1 = K - 1
  85. CALL DINTRV(T, N+1, X, INBV, I, MFLAG)
  86. IF (X.LT.T(K)) GO TO 120
  87. IF (MFLAG.EQ.0) GO TO 20
  88. IF (X.GT.T(I)) GO TO 130
  89. 10 IF (I.EQ.K) GO TO 140
  90. I = I - 1
  91. IF (X.EQ.T(I)) GO TO 10
  92. C
  93. C *** DIFFERENCE THE COEFFICIENTS *IDERIV* TIMES
  94. C WORK(I) = AJ(I), WORK(K+I) = DP(I), WORK(K+K+I) = DM(I), I=1.K
  95. C
  96. 20 IMK = I - K
  97. DO 30 J=1,K
  98. IMKPJ = IMK + J
  99. WORK(J) = A(IMKPJ)
  100. 30 CONTINUE
  101. IF (IDERIV.EQ.0) GO TO 60
  102. DO 50 J=1,IDERIV
  103. KMJ = K - J
  104. FKMJ = KMJ
  105. DO 40 JJ=1,KMJ
  106. IHI = I + JJ
  107. IHMKMJ = IHI - KMJ
  108. WORK(JJ) = (WORK(JJ+1)-WORK(JJ))/(T(IHI)-T(IHMKMJ))*FKMJ
  109. 40 CONTINUE
  110. 50 CONTINUE
  111. C
  112. C *** COMPUTE VALUE AT *X* IN (T(I),(T(I+1)) OF IDERIV-TH DERIVATIVE,
  113. C GIVEN ITS RELEVANT B-SPLINE COEFF. IN AJ(1),...,AJ(K-IDERIV).
  114. 60 IF (IDERIV.EQ.KM1) GO TO 100
  115. IP1 = I + 1
  116. KPK = K + K
  117. J1 = K + 1
  118. J2 = KPK + 1
  119. DO 70 J=1,KMIDER
  120. IPJ = I + J
  121. WORK(J1) = T(IPJ) - X
  122. IP1MJ = IP1 - J
  123. WORK(J2) = X - T(IP1MJ)
  124. J1 = J1 + 1
  125. J2 = J2 + 1
  126. 70 CONTINUE
  127. IDERP1 = IDERIV + 1
  128. DO 90 J=IDERP1,KM1
  129. KMJ = K - J
  130. ILO = KMJ
  131. DO 80 JJ=1,KMJ
  132. WORK(JJ) = (WORK(JJ+1)*WORK(KPK+ILO)+WORK(JJ)
  133. 1 *WORK(K+JJ))/(WORK(KPK+ILO)+WORK(K+JJ))
  134. ILO = ILO - 1
  135. 80 CONTINUE
  136. 90 CONTINUE
  137. 100 DBVALU = WORK(1)
  138. RETURN
  139. C
  140. C
  141. 101 CONTINUE
  142. CALL XERMSG ('SLATEC', 'DBVALU', 'N DOES NOT SATISFY N.GE.K', 2,
  143. + 1)
  144. RETURN
  145. 102 CONTINUE
  146. CALL XERMSG ('SLATEC', 'DBVALU', 'K DOES NOT SATISFY K.GE.1', 2,
  147. + 1)
  148. RETURN
  149. 110 CONTINUE
  150. CALL XERMSG ('SLATEC', 'DBVALU',
  151. + 'IDERIV DOES NOT SATISFY 0.LE.IDERIV.LT.K', 2, 1)
  152. RETURN
  153. 120 CONTINUE
  154. CALL XERMSG ('SLATEC', 'DBVALU',
  155. + 'X IS N0T GREATER THAN OR EQUAL TO T(K)', 2, 1)
  156. RETURN
  157. 130 CONTINUE
  158. CALL XERMSG ('SLATEC', 'DBVALU',
  159. + 'X IS NOT LESS THAN OR EQUAL TO T(N+1)', 2, 1)
  160. RETURN
  161. 140 CONTINUE
  162. CALL XERMSG ('SLATEC', 'DBVALU',
  163. + 'A LEFT LIMITING VALUE CANNOT BE OBTAINED AT T(K)', 2, 1)
  164. RETURN
  165. END