NAG CL Interface
e02dec (dim2_​spline_​evalv)

Settings help

CL Name Style:


1 Purpose

e02dec calculates values of a bicubic spline from its B-spline representation.

2 Specification

#include <nag.h>
void  e02dec (Integer m, const double x[], const double y[], double ff[], Nag_2dSpline *spline, NagError *fail)
The function may be called by the names: e02dec, nag_fit_dim2_spline_evalv or nag_2d_spline_eval.

3 Description

e02dec calculates values of the bicubic spline s (x,y) at prescribed points ( x r , y r ) , for r=1,2,,m, from its augmented knot sets {λ} and {μ} and from the coefficients c ij , for i=1,2,,splinenx - 4 and j=1,2,,splineny - 4, in its B-spline representation
s (x,y) = i,j c ij M i (x) N j (y) .  
Here M i (x) and N j (y) denote normalized cubic B-splines, the former defined on the knots λ i to λ i+4 and the latter on the knots μ j to μ j+4 .
This function may be used to calculate values of a bicubic spline given in the form produced by e01dac, e02dcc and e02ddc. It is derived from the routine B2VRE in Anthony et al. (1982).

4 References

Anthony G T, Cox M G and Hayes J G (1982) DASL – Data Approximation Subroutine Library National Physical Laboratory
Cox M G (1978) The numerical evaluation of a spline from its B-spline representation J. Inst. Math. Appl. 21 135–143

5 Arguments

1: m Integer Input
On entry: m , the number of points at which values of the spline are required.
Constraint: m1 .
2: x[m] const double Input
3: y[m] const double Input
On entry: x and y must contain x r and y r , for r=1,2,,m, respectively. These are the coordinates of the points at which values of the spline are required. The order of the points is immaterial.
Constraint: x and y must satisfy
splinelamda[3] x[r-1] splinelamda[splinenx-4]
and
splinemu[3] y[r-1] splinemu[splineny-4] .
The spline representation is not valid outside these intervals, for r=1,2,,m.
4: ff[m] double Output
On exit: ff[r-1] contains the value of the spline at the point ( x r , y r ) , for r=1,2,,m.
5: spline Nag_2dSpline *
Pointer to structure of type Nag_2dSpline with the following members:
nxIntegerInput
On entry: nx must specify the total number of knots associated with the variables x . It is such that nx-8 is the number of interior knots.
Constraint: nx8 .
lamdadouble *Input
On entry: a pointer to which memory of size nx must be allocated. lamda must contain the complete sets of knots {λ} associated with the x variable.
Constraint: the knots must be in nondecreasing order, with lamda[nx-4] > lamda[3] .
nyIntegerInput
On entry: ny must specify the total number of knots associated with the variable y .
It is such that ny-8 is the number of interior knots.
Constraint: ny8 .
mudouble *Input
On entry: a pointer to which memory of size ny must be allocated. mu must contain the complete sets of knots {μ} associated with the y variable.
Constraint: the knots must be in nondecreasing order, with mu[ny-4] > mu[3] .
cdouble *Input
On entry: a pointer to which memory of size (nx-4) × (ny-4) must be allocated. c[ (ny-4) × (i-1) + j - 1 ] must contain the coefficient c ij described in Section 3, for i=1,2,,nx - 4 and j=1,2,,ny - 4.
In normal usage, the call to e02dec follows a call to e01dac, e02dcc or e02ddc, in which case, members of the structure spline will have been set up correctly for input to e02dec.
6: fail NagError * Input/Output
The NAG error argument (see Section 7 in the Introduction to the NAG Library CL Interface).

6 Error Indicators and Warnings

NE_ALLOC_FAIL
Dynamic memory allocation failed.
NE_END_KNOTS_CONS
On entry, the end knots must satisfy value, value=value , value=value .
NE_INT_ARG_LT
On entry, m=value.
Constraint: m1.
On entry, splinenx must not be less than 8: splinenx=value .
On entry, splineny must not be less than 8: splineny=value .
NE_NOT_INCREASING
The sequence splinelamda is not increasing: splinelamda[value] = value, splinelamda[value] = value.
The sequence splinemu is not increasing: splinemu[value] = value, splinemu[value] = value.
NE_POINT_OUTSIDE_RECT
On entry, point ( x[value] = value , y[value] = value ) lies outside the rectangle bounded by splinelamda[3] = value, splinelamda[value] = value, splinemu[3] = value, splinemu[value] = value.

7 Accuracy

The method used to evaluate the B-splines is numerically stable, in the sense that each computed value of s ( x r , y r ) can be regarded as the value that would have been obtained in exact arithmetic from slightly perturbed B-spline coefficients. See Cox (1978) for details.

8 Parallelism and Performance

Background information to multithreading can be found in the Multithreading documentation.
e02dec is not threaded in any implementation.

9 Further Comments

Computation time is approximately proportional to the number of points, m , at which the evaluation is required.

10 Example

This program reads in knot sets splinelamda[0] , , splinelamda[splinenx-1] and splinemu[0] , , splinemu[splineny-1] , and a set of bicubic spline coefficients c ij . Following these are a value for m and the coordinates ( x r , y r ) , for r=1,2,,m, at which the spline is to be evaluated.

10.1 Program Text

Program Text (e02dece.c)

10.2 Program Data

Program Data (e02dece.d)

10.3 Program Results

Program Results (e02dece.r)