BS2GD
Evaluates the derivative of a two-dimensional tensor-product spline, given its tensor-product B-spline representation on a grid.
Required Arguments
IXDER — Order of the derivative in the X-direction. (Input)
IYDER — Order of the derivative in the Y-direction. (Input)
XVEC — Array of length NX containing the X-coordinates at which the spline is to be evaluated. (Input)
The points in XVEC should be strictly increasing.
YVEC — Array of length NY containing the Y-coordinates at which the spline is to be evaluated. (Input)
The points in YVEC should be strictly increasing.
KXORD — Order of the spline in the X-direction. (Input)
KYORD — Order of the spline in the Y-direction. (Input)
XKNOT — Array of length NXCOEF + KXORD containing the knot sequence in the X-direction. (Input)
XKNOT must be nondecreasing.
YKNOT — Array of length NYCOEF + KYORD containing the knot sequence in the Y-direction. (Input)
YKNOT must be nondecreasing.
BSCOEF — Array of length NXCOEF * NYCOEF containing the tensor-product B-spline coefficients. (Input)
BSCOEF is treated internally as a matrix of size NXCOEF by NYCOEF.
VALUE — Value of the (IXDER, IYDER) derivative of the spline on the NX by NY grid. (Output)
VALUE (I, J) contains the derivative of the spline at the point (XVEC(I), YVEC(J)).
Optional Arguments
NX — Number of grid points in the X-direction. (Input)
Default: NX = size (XVEC,1).
NY — Number of grid points in the Y-direction. (Input)
Default: NY = size (YVEC,1).
NXCOEF — Number of B-spline coefficients in the X-direction. (Input)
Default: NXCOEF = size (XKNOT,1) - KXORD.
NYCOEF — Number of B-spline coefficients in the Y-direction. (Input)
Default: NYCOEF = size (YKNOT,1) - KYORD.
LDVALU — Leading dimension of VALUE exactly as specified in the dimension statement of the calling program. (Input)
Default: LDVALU = SIZE (VALUE,1).
FORTRAN 90 Interface
Generic: CALL BS2GD (IXDER, IDER, XVEC, YVEC, KXORD, KYORD, XKNOT, YKNOT, BSCOEF, VALUE [, …])
Specific: The specific interface names are S_BS2GD and D_BS2GD.
FORTRAN 77 Interface
Single: CALL BS2GD (IXDER, IYDER, NX, XVEC, NY, YVEC, KXORD, KYORD, XKNOT, YKNOT, NXCOEF, NYCOEF, BSCOEF, VALUE, LDVALU)
Double: The double precision name is DBS2GD.
Description
The routine BS2GD evaluates a partial derivative of a bivariate tensor-product spline (represented as a linear combination of tensor-product B-splines) on a grid of points; see de Boor (1978, pages 351-353).
This routine returns the values of s(p,q)on the grid (xi, yj) for i = 1, …, nx and j = 1, …, ny given the coefficients c by computing (for all (x, y) in the grid)
where kx and ky are the orders of the splines. (These numbers are passed to the subroutine in KXORD and KYORD, respectively.) Likewise, tx and ty are the corresponding knot sequences (XKNOT and YKNOT). The grid must be ordered in the sense that xi < xi+1 and yj < yj+1.
Comments
1. Workspace may be explicitly provided, if desired, by use of B22GD/DB22GD. The reference is:
CALL B22GD (IXDER, IYDER, NX, XVEC, NY, YVEC, KXORD, KYORD, XKNOT, YKNOT, NXCOEF, NYCOEF, BSCOEF, VALUE, LDVALU, LEFTX, LEFTY, A, B, DBIATX, DBIATY, BX, BY)
The additional arguments are as follows:
LEFTX — Integer work array of length NX.
LEFTY — Integer work array of length NY.
A — Work array of length KXORD * KXORD.
B — Work array of length KYORD * KYORD.
DBIATX — Work array of length KXORD * (IXDER + 1).
DBIATY — Work array of length KYORD * (IYDER + 1).
BX — Work array of length KXORD * NX.
BY — Work array of length KYORD * NY.
2. Informational errors
Type |
Code |
Description |
3 |
1 |
XVEC(I) does not satisfy XKNOT (KXORD) .LE. XVEC(I) .LE. XKNOT(NXCOEF + 1) |
3 |
2 |
YVEC(I) does not satisfy YKNOT (KYORD) .LE. YVEC(I) .LE. YKNOT(NYCOEF + 1) |
4 |
3 |
XVEC is not strictly increasing. |
4 |
4 |
YVEC is not strictly increasing. |
Example
In this example, a spline interpolant s to a function f is constructed. We use the IMSL routine BS2IN to compute the interpolant and then BS2GD is employed to compute s(2,1) (x, y) on a grid. The values of this partial derivative and the error are computed on a 4 × 4 grid and then displayed.
USE BS2GD_INT
USE BS2IN_INT
USE BSNAK_INT
USE UMACH_INT
IMPLICIT NONE
! SPECIFICATIONS FOR LOCAL VARIABLES
INTEGER I, J, KXORD, KYORD, LDF, NOUT, NXCOEF, NXDATA,&
NYCOEF, NYDATA
REAL DCCFD(21,6), DOCBSC(21,6), DOCXD(21), DOCXK(26),&
DOCYD(6), DOCYK(9), F, F21, FLOAT, VALUE(4,4),&
X, XVEC(4), Y, YVEC(4)
INTRINSIC FLOAT
! Define function and derivative
F(X,Y) = X*X*X*X + X*X*X*Y*Y
F21(X,Y) = 12.0*X*Y
! Initialize/Setup
CALL UMACH (2, NOUT)
KXORD = 5
KYORD = 3
NXDATA = 21
NYDATA = 6
LDF = NXDATA
! Set up interpolation points
DO 10 I=1, NXDATA
DOCXD(I) = FLOAT(I-11)/10.0
10 CONTINUE
! Set up interpolation points
DO 20 I=1, NYDATA
DOCYD(I) = FLOAT(I-1)/5.0
20 CONTINUE
! Generate knot sequence
CALL BSNAK (NXDATA, DOCXD, KXORD, DOCXK)
! Generate knot sequence
CALL BSNAK (NYDATA, DOCYD, KYORD, DOCYK)
! Generate FDATA
DO 40 I=1, NYDATA
DO 30 J=1, NXDATA
DCCFD(J,I) = F(DOCXD(J),DOCYD(I))
30 CONTINUE
40 CONTINUE
! Interpolate
CALL BS2IN (DOCXD, DOCYD, DCCFD, KXORD, KYORD, &
DOCXK, DOCYK, DOCBSC)
! Print (2,1) derivative over a
! grid of [0.0,1.0] x [0.0,1.0]
! at 16 points.
NXCOEF = NXDATA
NYCOEF = NYDATA
WRITE (NOUT,99999)
DO 50 I=1, 4
XVEC(I) = FLOAT(I-1)/3.0
YVEC(I) = XVEC(I)
50 CONTINUE
CALL BS2GD (2, 1, XVEC, YVEC, KXORD, KYORD, DOCXK, DOCYK,&
DOCBSC, VALUE)
DO 70 I=1, 4
DO 60 J=1, 4
WRITE (NOUT,'(3F15.4,F15.6)') XVEC(I), YVEC(J),&
VALUE(I,J),&
F21(XVEC(I),YVEC(J)) -&
VALUE(I,J)
60 CONTINUE
70 CONTINUE
99999 FORMAT (39X, '(2,1)', /, 13X, 'X', 14X, 'Y', 10X, 'S (X,Y)',&
5X, 'Error')
END
(2,1)
X Y S (X,Y) Error
0.0000 0.0000 0.0000 0.000000
0.0000 0.3333 0.0000 0.000000
0.0000 0.6667 0.0000 0.000000
0.0000 1.0000 0.0000 0.000001
0.3333 0.0000 0.0000 -0.000001
0.3333 0.3333 1.3333 0.000001
0.3333 0.6667 2.6667 -0.000004
0.3333 1.0000 4.0000 0.000008
0.6667 0.0000 0.0000 -0.000001
0.6667 0.3333 2.6667 -0.000008
0.6667 0.6667 5.3333 0.000038
0.6667 1.0000 8.0001 -0.000113
1.0000 0.0000 -0.0005 0.000488
1.0000 0.3333 4.0004 -0.000412
1.0000 0.6667 7.9995 0.000488
1.0000 1.0000 12.0002 -0.000244