123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- *DECK BSPDR
- SUBROUTINE BSPDR (T, A, N, K, NDERIV, AD)
- C***BEGIN PROLOGUE BSPDR
- C***PURPOSE Use the B-representation to construct a divided difference
- C table preparatory to a (right) derivative calculation.
- C***LIBRARY SLATEC
- C***CATEGORY E3
- C***TYPE SINGLE PRECISION (BSPDR-S, DBSPDR-D)
- C***KEYWORDS B-SPLINE, DATA FITTING, DIFFERENTIATION OF SPLINES,
- C INTERPOLATION
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Written by Carl de Boor and modified by D. E. Amos
- C
- C Abstract
- C BSPDR is the BSPLDR routine of the reference.
- C
- C BSPDR uses the B-representation (T,A,N,K) to construct a
- C divided difference table ADIF preparatory to a (right)
- C derivative calculation in BSPEV. The lower triangular matrix
- C ADIF is stored in vector AD by columns. The arrays are
- C related by
- C
- C ADIF(I,J) = AD(I-J+1 + (2*N-J+2)*(J-1)/2)
- C
- C I = J,N , J = 1,NDERIV .
- C
- C Description of Arguments
- C Input
- C T - knot vector of length N+K
- C A - B-spline coefficient vector of length N
- C N - number of B-spline coefficients
- C N = sum of knot multiplicities-K
- C K - order of the spline, K .GE. 1
- C NDERIV - number of derivatives, 1 .LE. NDERIV .LE. K.
- C NDERIV=1 gives the zero-th derivative = function
- C value
- C
- C Output
- C AD - table of differences in a vector of length
- C (2*N-NDERIV+1)*NDERIV/2 for input to BSPEV
- C
- C Error Conditions
- C Improper input is a fatal error
- C
- C***REFERENCES Carl de Boor, Package for calculating with B-splines,
- C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
- C pp. 441-472.
- C***ROUTINES CALLED XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BSPDR
- C
- INTEGER I, ID, II, IPKMID, JJ, JM, K, KMID, N, NDERIV
- REAL A, AD, DIFF, FKMID, T
- C DIMENSION T(N+K), AD((2*N-NDERIV+1)*NDERIV/2)
- DIMENSION T(*), A(*), AD(*)
- C***FIRST EXECUTABLE STATEMENT BSPDR
- IF(K.LT.1) GO TO 100
- IF(N.LT.K) GO TO 105
- IF(NDERIV.LT.1 .OR. NDERIV.GT.K) GO TO 110
- DO 10 I=1,N
- AD(I) = A(I)
- 10 CONTINUE
- IF (NDERIV.EQ.1) RETURN
- KMID = K
- JJ = N
- JM = 0
- DO 30 ID=2,NDERIV
- KMID = KMID - 1
- FKMID = KMID
- II = 1
- DO 20 I=ID,N
- IPKMID = I + KMID
- DIFF = T(IPKMID) - T(I)
- IF (DIFF.NE.0.0E0) AD(II+JJ) = (AD(II+JM+1)-AD(II+JM))/
- 1 DIFF*FKMID
- II = II + 1
- 20 CONTINUE
- JM = JJ
- JJ = JJ + N - ID + 1
- 30 CONTINUE
- RETURN
- C
- C
- 100 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPDR', 'K DOES NOT SATISFY K.GE.1', 2,
- + 1)
- RETURN
- 105 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPDR', 'N DOES NOT SATISFY N.GE.K', 2,
- + 1)
- RETURN
- 110 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPDR',
- + 'NDERIV DOES NOT SATISFY 1.LE.NDERIV.LE.K', 2, 1)
- RETURN
- END
|