# bspvn.f

          SUBROUTINE BSPVN (T, JHIGH, K, INDEX, X, ILEFT, VNIKX, WORK,
         +   IWORK)
    C***BEGIN PROLOGUE  BSPVN
    C***PURPOSE  Calculate the value of all (possibly) nonzero basis
    C            functions at X.
    C***LIBRARY   SLATEC
    C***CATEGORY  E3, K6
    C***TYPE      SINGLE PRECISION (BSPVN-S, DBSPVN-D)
    C***KEYWORDS  EVALUATION OF B-SPLINE
    C***AUTHOR  Amos, D. E., (SNLA)
    C***DESCRIPTION
    C
    C     Written by Carl de Boor and modified by D. E. Amos
    C
    C     Abstract
    C         BSPVN is the BSPLVN routine of the reference.
    C
    C         BSPVN calculates the value of all (possibly) nonzero basis
    C         functions at X of order MAX(JHIGH,(J+1)*(INDEX-1)), where
    C         T(K) .LE. X .LE. T(N+1) and J=IWORK is set inside the routine
    C         on the first call when INDEX=1.  ILEFT is such that T(ILEFT)
    C         .LE. X .LT. T(ILEFT+1).  A call to INTRV(T,N+1,X,ILO,ILEFT,
    C         MFLAG) produces the proper ILEFT.  BSPVN calculates using the
    C         basic algorithm needed in BSPVD.  If only basis functions are
    C         desired, setting JHIGH=K and INDEX=1 can be faster than
    C         calling BSPVD, but extra coding is required for derivatives
    C         (INDEX=2) and BSPVD is set up for this purpose.
    C
    C         Left limiting values are set up as described in BSPVD.
    C
    C     Description of Arguments
    C         Input
    C          T       - knot vector of length N+K, where
    C                    N = number of B-spline basis functions
    C                    N = sum of knot multiplicities-K
    C          JHIGH   - order of B-spline, 1 .LE. JHIGH .LE. K
    C          K       - highest possible order
    C          INDEX   - INDEX = 1 gives basis functions of order JHIGH
    C                          = 2 denotes previous entry with WORK, IWORK
    C                              values saved for subsequent calls to
    C                              BSPVN.
    C          X       - argument of basis functions,
    C                    T(K) .LE. X .LE. T(N+1)
    C          ILEFT   - largest integer such that
    C                    T(ILEFT) .LE. X .LT. T(ILEFT+1)
    C
    C         Output
    C          VNIKX   - vector of length K for spline values.
    C          WORK    - a work vector of length 2*K
    C          IWORK   - a work parameter.  Both WORK and IWORK contain
    C                    information necessary to continue for INDEX = 2.
    C                    When INDEX = 1 exclusively, these are scratch
    C                    variables and can be used for other purposes.
    C
    C     Error Conditions
    C         Improper input is a fatal error.
    C
    C***REFERENCES  Carl de Boor, Package for calculating with B-splines,
    C                 SIAM Journal on Numerical Analysis 14, 3 (June 1977),
    C                 pp. 441-472.
    C***ROUTINES CALLED  XERMSG
    C***REVISION HISTORY  (YYMMDD)
    C   800901  DATE WRITTEN
    C   890831  Modified array declarations.  (WRB)
    C   890831  REVISION DATE from Version 3.2
    C   891214  Prologue converted to Version 4.0 format.  (BAB)
    C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
    C   900326  Removed duplicate information from DESCRIPTION section.
    C           (WRB)
    C   920501  Reformatted the REFERENCES section.  (WRB)
    C***END PROLOGUE  BSPVN