OpenLibm/slatec/dppval.f
Viral B. Shah c977aa998f Add Makefile.extras to build libopenlibm-extras.
Replace amos with slatec
2012-12-31 16:37:05 -05:00

104 lines
3.8 KiB
Fortran

*DECK DPPVAL
DOUBLE PRECISION FUNCTION DPPVAL (LDC, C, XI, LXI, K, IDERIV, X,
+ INPPV)
C***BEGIN PROLOGUE DPPVAL
C***PURPOSE Calculate the value of the IDERIV-th derivative of the
C B-spline from the PP-representation.
C***LIBRARY SLATEC
C***CATEGORY E3, K6
C***TYPE DOUBLE PRECISION (PPVAL-S, DPPVAL-D)
C***KEYWORDS B-SPLINE, DATA FITTING, INTERPOLATION, SPLINES
C***AUTHOR Amos, D. E., (SNLA)
C***DESCRIPTION
C
C Written by Carl de Boor and modified by D. E. Amos
C
C Abstract **** a double precision routine ****
C DPPVAL is the PPVALU function of the reference.
C
C DPPVAL calculates (at X) the value of the IDERIV-th
C derivative of the B-spline from the PP-representation
C (C,XI,LXI,K). The Taylor expansion about XI(J) for X in
C the interval XI(J) .LE. X .LT. XI(J+1) is evaluated, J=1,LXI.
C Right limiting values at X=XI(J) are obtained. DPPVAL will
C extrapolate beyond XI(1) and XI(LXI+1).
C
C To obtain left limiting values (left derivatives) at XI(J)
C replace LXI by J-1 and set X=XI(J),J=2,LXI+1.
C
C Description of Arguments
C
C Input C,XI,X are double precision
C LDC - leading dimension of C matrix, LDC .GE. K
C C - matrix of dimension at least (K,LXI) containing
C right derivatives at break points XI(*).
C XI - break point vector of length LXI+1
C LXI - number of polynomial pieces
C K - order of B-spline, K .GE. 1
C IDERIV - order of the derivative, 0 .LE. IDERIV .LE. K-1
C IDERIV=0 gives the B-spline value
C X - argument, XI(1) .LE. X .LE. XI(LXI+1)
C INPPV - an initialization parameter which must be set
C to 1 the first time DPPVAL is called.
C
C Output DPPVAL is double precision
C INPPV - INPPV contains information for efficient process-
C ing after the initial call and INPPV must not
C be changed by the user. Distinct splines require
C distinct INPPV parameters.
C DPPVAL - value of the IDERIV-th derivative at X
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 DINTRV, 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 920501 Reformatted the REFERENCES section. (WRB)
C***END PROLOGUE DPPVAL
C
INTEGER I, IDERIV, INPPV, J, K, LDC, LXI, NDUMMY, KK
DOUBLE PRECISION C, DX, X, XI
DIMENSION XI(*), C(LDC,*)
C***FIRST EXECUTABLE STATEMENT DPPVAL
DPPVAL = 0.0D0
IF(K.LT.1) GO TO 90
IF(LDC.LT.K) GO TO 80
IF(LXI.LT.1) GO TO 85
IF(IDERIV.LT.0 .OR. IDERIV.GE.K) GO TO 95
I = K - IDERIV
KK = I
CALL DINTRV(XI, LXI, X, INPPV, I, NDUMMY)
DX = X - XI(I)
J = K
10 DPPVAL = (DPPVAL/KK)*DX + C(J,I)
J = J - 1
KK = KK - 1
IF (KK.GT.0) GO TO 10
RETURN
C
C
80 CONTINUE
CALL XERMSG ('SLATEC', 'DPPVAL', 'LDC DOES NOT SATISFY LDC.GE.K',
+ 2, 1)
RETURN
85 CONTINUE
CALL XERMSG ('SLATEC', 'DPPVAL', 'LXI DOES NOT SATISFY LXI.GE.1',
+ 2, 1)
RETURN
90 CONTINUE
CALL XERMSG ('SLATEC', 'DPPVAL', 'K DOES NOT SATISFY K.GE.1', 2,
+ 1)
RETURN
95 CONTINUE
CALL XERMSG ('SLATEC', 'DPPVAL',
+ 'IDERIV DOES NOT SATISFY 0.LE.IDERIV.LT.K', 2, 1)
RETURN
END