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

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

!                yj                  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

Output

 

                                  (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


Visual Numerics, Inc.
Visual Numerics - Developers of IMSL and PV-WAVE
http://www.vni.com/
PHONE: 713.784.3131
FAX:713.781.9260