BS3IG

This function evaluates the integral of a tensor-product spline in three dimensions over a three-dimensional rectangle, given its tensor-product B-spline representation.

Function Return Value

BS3IG — Integral of the spline over the three-dimensional rectangle (A, B) by (C, D) by (E, F).   (Output)

Required Arguments

A — Lower limit of the X-variable.   (Input)

B — Upper limit of the X-variable.   (Input)

C — Lower limit of the Y-variable.   (Input)

D — Upper limit of the Y-variable.   (Input)

E — Lower limit of the Z-variable.   (Input)

F — Upper limit of the Z-variable.   (Input)

KXORD — Order of the spline in the X-direction.   (Input)

KYORD — Order of the spline in the Y-direction.   (Input)

KZORD — Order of the spline in the Z-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.

ZKNOT — Array of length NZCOEF + KZORD containing the knot sequence in the Z-direction.   (Input)
ZKNOT must be nondecreasing.

NXCOEF — Number of B-spline coefficients in the X-direction.   (Input)

NYCOEF — Number of B-spline coefficients in the Y-direction.   (Input)

NZCOEF — Number of B-spline coefficients in the Z-direction.   (Input)

BSCOEF — Array of length NXCOEF * NYCOEF * NZCOEF containing the tensor-product
B-spline coefficients.   (Input)
BSCOEF is treated internally as a matrix of size NXCOEF by NYCOEF by NZCOEF.

FORTRAN 90 Interface

Generic:    BS3IG (A, B, C, D, E, F, KXORD, KYORD, KZORD, XKNOT, YKNOT, ZKNOT, NXCOEF, NYCOEF, NZCOEF, BSCOEF)

Specific:         The specific interface names are S_BS3IG and D_BS3IG.

FORTRAN 77 Interface

Single:             BS3IG (A, B, C, D, E, F, KXORD, KYORD, KZORD, XKNOT, YKNOT, ZKNOT, NXCOEF, NYCOEF, NZCOEF, BSCOEF)

Double:           The double precision function name is DBS3IG.

Description

The routine BS3IG computes the integral of a tensor-product three-dimensional spline, given its
B-spline representation. Specifically, given the knot sequence tx = XKNOT, ty = YKNOT, tz = ZKNOT, the order kx = KXORD, ky = KYORD, kz = KZORD, the coefficients β = BSCOEF, the number of coefficients nx = NXCOEF, ny = NYCOEF, nz = NZCOEF, and a three-dimensional rectangle [ab] by [c, d] by [e, f], BS3IG returns the value

where

This routine uses the identity (22) on page 151 of de Boor (1978). It assumes (for all knot sequences) that the first and last k knots are stacked, that is, t1 = = tk and tn + 1 = = tn + k, where k is the order of the spline in the x, y, or z direction.

Comments

1.         Workspace may be explicitly provided, if desired, by use of B23IG/DB23IG. The reference is:

CALL B23IG(A, B, C, D, E, F, KXORD, KYORD, KZORD, XKNOT, YKNOT, ZKNOT, NXCOEF, NYCOEF, NZCOEF, BSCOEF, WK)

The additional argument is:

WK — Work array of length 4 * (MAX(KXORD, KYORD, KZORD) + 1) + NYCOEF + NZCOEF.

2.         Informational errors

Type   Code

3           1                  The lower limit of the X-integration is less than XKNOT(KXORD).

3           2                  The upper limit of the X-integration is greater than
XKNOT(NXCOEF + 1).

3           3                  The lower limit of the Y-integration is less than YKNOT(KYORD).

3           4                  The upper limit of the Y-integration is greater than
YKNOT(NYCOEF + 1).

3           5                  The lower limit of the Z- integration is less than ZKNOT(KZORD).

3           6                  The upper limit of the Z-integration is greater than
ZKNOT(NZCOEF + 1).

4           13                Multiplicity of the knots cannot exceed the order of the spline.

4           14                The knots must be nondecreasing.

Example

We integrate the three-dimensional tensor-product quartic (kx = 5) by linear (ky = 2) by quadratic (kz = 3) spline which interpolates x3 + xyz at the points

over the rectangle [0, 1] × [.5, 1] × [0, .5]. The exact answer is 11/128.

 

      USE BS3IG_INT

      USE BS3IN_INT

      USE BSNAK_INT

      USE UMACH_INT

 

      IMPLICIT   NONE

!                                  SPECIFICATIONS FOR PARAMETERS

      INTEGER    KXORD, KYORD, KZORD, LDF, MDF, NXDATA, NXKNOT,&

                 NYDATA, NYKNOT, NZDATA, NZKNOT

      PARAMETER  (KXORD=5, KYORD=2, KZORD=3, NXDATA=21, NYDATA=6,&

                 NZDATA=8, LDF=NXDATA, MDF=NYDATA,&

                 NXKNOT=NXDATA+KXORD, NYKNOT=NYDATA+KYORD,&

                 NZKNOT=NZDATA+KZORD)

!

      INTEGER    I, J, K, NOUT, NXCOEF, NYCOEF, NZCOEF

      REAL       A, B, BSCOEF(NXDATA,NYDATA,NZDATA), C , D, E,&

                 F, FDATA(LDF,MDF,NZDATA), FF, FIG, FLOAT, G, H, RI,&

                 RJ, VAL, X, XDATA(NXDATA), XKNOT(NXKNOT), Y,&

                 YDATA(NYDATA), YKNOT(NYKNOT), Z, ZDATA(NZDATA),&

                 ZKNOT(NZKNOT)

      INTRINSIC  FLOAT

!                                  Define function

      F(X,Y,Z) = X*X*X + X*Y*Z

!                                  Set up interpolation points

      DO 10  I=1, NXDATA

         XDATA(I) = FLOAT(I-11)/10.0

   10 CONTINUE

!                                  Generate knot sequence

      CALL BSNAK (NXDATA, XDATA, KXORD, XKNOT)

!                                  Set up interpolation points

      DO 20  I=1, NYDATA

         YDATA(I) = FLOAT(I-1)/FLOAT(NYDATA-1)

   20 CONTINUE

!                                  Generate knot sequence

      CALL BSNAK (NYDATA, YDATA, KYORD, YKNOT)

!                                  Set up interpolation points

      DO 30  I=1, NZDATA

         ZDATA(I) = FLOAT(I-1)/FLOAT(NZDATA-1)

   30 CONTINUE

!                                  Generate knot sequence

      CALL BSNAK (NZDATA, ZDATA, KZORD, ZKNOT)

!                                  Generate FDATA

      DO 50  K=1, NZDATA

         DO 40  I=1, NYDATA

            DO 40  J=1, NXDATA

               FDATA(J,I,K) = F(XDATA(J),YDATA(I),ZDATA(K))

   40  CONTINUE

   50 CONTINUE

!                                  Get output unit number

      CALL UMACH (2, NOUT)

!                                  Interpolate

      CALL BS3IN (XDATA, YDATA, ZDATA, FDATA, KXORD, KYORD, KZORD, XKNOT, &

                  YKNOT, ZKNOT, BSCOEF)

!

      NXCOEF = NXDATA

      NYCOEF = NYDATA

      NZCOEF = NZDATA

      A      = 0.0

      B      = 1.0

      C      = 0.5

      D      = 1.0

      E      = 0.0

      FF     = 0.5

!                                  Integrate

      VAL    = BS3IG(A,B,C ,D,E,FF,KXORD,KYORD,KZORD,XKNOT,YKNOT,ZKNOT,&

               NXCOEF,NYCOEF,NZCOEF,BSCOEF)

!                                  Calculate integral directly

      G   = .5*(B**4-A**4)

      H   = (B-A)*(B+A)

      RI  = G*(D-C )

      RJ  = .5*H*(D-C )*(D+C )

      FIG = .5*(RI*(FF-E)+.5*RJ*(FF-E)*(FF+E))

!                                  Print results

      WRITE (NOUT,99999) VAL, FIG, FIG - VAL

99999 FORMAT (' Computed Integral = ', F10.5, /, ' Exact Integral    '&

             , '= ', F10.5,/, ' Error             '&

             , '= ', F10.6, /)

      END

Output

 

Computed Integral =    0.08594
Exact Integral    =    0.08594
Error             =   0.000000


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