1 subroutine bsplvd ( t, lent, k, x, left, a, dbiatx, nderiv )
5 C calculates value and deriv.s of all b-splines which do not vanish at x
8 c****** i n p u t ******
9 c t the knot array, of length left+k (at least)
10 c k the order of the b-splines to be evaluated
11 c x the point at which these values are sought
12 c left an integer indicating the left endpoint of the interval of
13 c interest. the k b-splines whose support contains the interval
14 c (t(left), t(left+1))
15 c are to be considered.
16 c a s s u m p t i o n - - - it is assumed that
18 c division by zero will result otherwise (in b s p l v b ).
19 c also, the output is as advertised only if
20 c t(left) <= x <= t(left+1) .
21 c nderiv an integer indicating that values of b-splines and their
22 c derivatives up to but not including the nderiv-th are asked
23 c for. ( nderiv is replaced internally by the integer in (1,k)
26 c****** w o r k a r e a ******
27 c a an array of order (k,k), to contain b-coeff.s of the derivat-
28 c ives of a certain order of the k b-splines of interest.
30 c****** o u t p u t ******
31 c dbiatx an array of order (k,nderiv). its entry (i,m) contains
32 c value of (m-1)st derivative of (left-k+i)-th b-spline of
33 c order k for knot sequence t , i=m,...,k; m=1,...,nderiv.
35 c****** m e t h o d ******
36 c values at x of all the relevant b-splines of order k,k-1,...,
37 c k+1-nderiv are generated via bsplvb and stored temporarily
38 c in dbiatx . then, the b-coeffs of the required derivatives of the
39 c b-splines of interest are generated by differencing, each from the
40 c preceding one of lower order, and combined with the values of b-
41 c splines of corresponding order in dbiatx to produce the desired
45 integer lent,k,left,nderiv
46 double precision t(lent),x, dbiatx(k,nderiv), a(k,k)
48 double precision factor,fkp1mm,sum
49 integer i,ideriv,il,j,jlow,jp1mid, kp1,kp1mm,ldummy,m,mhigh
51 mhigh = max0(min0(nderiv,k),1)
52 c mhigh is usually equal to nderiv.
54 call bsplvb(t,lent,kp1-mhigh,1,x,left,dbiatx)
55 if (mhigh .eq. 1) go to 99
56 c the first column of dbiatx always contains the b-spline values
57 c for the current order. these are stored in column k+1-current
58 c order before bsplvb is called to put values for the next
59 c higher order on top of it.
64 dbiatx(j,ideriv) = dbiatx(jp1mid,1)
65 11 jp1mid = jp1mid + 1
67 call bsplvb(t,lent,kp1-ideriv,2,x,left,dbiatx)
70 c at this point, b(left-k+i, k+1-j)(x) is in dbiatx(i,j) for
71 c i=j,...,k and j=1,...,mhigh ('=' nderiv). in particular, the
72 c first column of dbiatx is already in final form. to obtain cor-
73 c responding derivatives of b-splines in subsequent columns, gene-
74 c rate their b-repr. by differencing, then evaluate at x.
82 c at this point, a(.,j) contains the b-coeffs for the j-th of the
83 c k b-splines of interest here.
91 c for j=1,...,k, construct b-coeffs of (m-1)st derivative of
92 c b-splines from those for preceding derivative by differencing
93 c and store again in a(.,j) . the fact that a(i,j) = 0 for
96 factor = fkp1mm/(t(il+kp1mm) - t(il))
97 c the assumption that t(left) < t(left+1) makes denominator
100 24 a(i,j) = (a(i,j) - a(i-1,j))*factor
104 c for i=1,...,k, combine b-coeffs a(.,i) with b-spline values
105 c stored in dbiatx(.,m) to get value of (m-1)st derivative of
106 c i-th b-spline (of interest here) at x , and store in
107 c dbiatx(i,m). storage of this value over the value of a b-spline
108 c of order m there is safe since the remaining b-spline derivat-
109 c ive of the same order do not use this value due to the fact
110 c that a(j,i) = 0 for j < i .
115 35 sum = a(j,i)*dbiatx(j,m) + sum