--- /dev/null
+*DECK INTRV
+ SUBROUTINE INTRV (XT, LXT, X, ILO, ILEFT, MFLAG)
+C***BEGIN PROLOGUE INTRV
+C***PURPOSE Compute the largest integer ILEFT in 1 .LE. ILEFT .LE. LXT
+C such that XT(ILEFT) .LE. X where XT(*) is a subdivision
+C of the X interval.
+C***LIBRARY SLATEC
+C***CATEGORY E3, K6
+C***TYPE SINGLE PRECISION (INTRV-S, DINTRV-D)
+C***KEYWORDS B-SPLINE, DATA FITTING, INTERPOLATION, SPLINES
+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 INTRV is the INTERV routine of the reference.
+C
+C INTRV computes the largest integer ILEFT in 1 .LE. ILEFT .LE.
+C LXT such that XT(ILEFT) .LE. X where XT(*) is a subdivision of
+C the X interval. Precisely,
+C
+C X .LT. XT(1) 1 -1
+C if XT(I) .LE. X .LT. XT(I+1) then ILEFT=I , MFLAG=0
+C XT(LXT) .LE. X LXT 1,
+C
+C That is, when multiplicities are present in the break point
+C to the left of X, the largest index is taken for ILEFT.
+C
+C Description of Arguments
+C Input
+C XT - XT is a knot or break point vector of length LXT
+C LXT - length of the XT vector
+C X - argument
+C ILO - an initialization parameter which must be set
+C to 1 the first time the spline array XT is
+C processed by INTRV.
+C
+C Output
+C ILO - ILO contains information for efficient process-
+C ing after the initial call, and ILO must not be
+C changed by the user. Distinct splines require
+C distinct ILO parameters.
+C ILEFT - largest integer satisfying XT(ILEFT) .LE. X
+C MFLAG - signals when X lies out of bounds
+C
+C Error Conditions
+C None
+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 (NONE)
+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 920501 Reformatted the REFERENCES section. (WRB)
+C***END PROLOGUE INTRV
+C
+ INTEGER IHI, ILEFT, ILO, ISTEP, LXT, MFLAG, MIDDLE
+ Double precision X, XT
+ DIMENSION XT(*)
+C***FIRST EXECUTABLE STATEMENT INTRV
+ IHI = ILO + 1
+ IF (IHI.LT.LXT) GO TO 10
+ IF (X.GE.XT(LXT)) GO TO 110
+ IF (LXT.LE.1) GO TO 90
+ ILO = LXT - 1
+ IHI = LXT
+C
+ 10 IF (X.GE.XT(IHI)) GO TO 40
+ IF (X.GE.XT(ILO)) GO TO 100
+C
+C *** NOW X .LT. XT(IHI) . FIND LOWER BOUND
+ ISTEP = 1
+ 20 IHI = ILO
+ ILO = IHI - ISTEP
+ IF (ILO.LE.1) GO TO 30
+ IF (X.GE.XT(ILO)) GO TO 70
+ ISTEP = ISTEP*2
+ GO TO 20
+ 30 ILO = 1
+ IF (X.LT.XT(1)) GO TO 90
+ GO TO 70
+C *** NOW X .GE. XT(ILO) . FIND UPPER BOUND
+ 40 ISTEP = 1
+ 50 ILO = IHI
+ IHI = ILO + ISTEP
+ IF (IHI.GE.LXT) GO TO 60
+ IF (X.LT.XT(IHI)) GO TO 70
+ ISTEP = ISTEP*2
+ GO TO 50
+ 60 IF (X.GE.XT(LXT)) GO TO 110
+ IHI = LXT
+C
+C *** NOW XT(ILO) .LE. X .LT. XT(IHI) . NARROW THE INTERVAL
+ 70 MIDDLE = (ILO+IHI)/2
+ IF (MIDDLE.EQ.ILO) GO TO 100
+C NOTE. IT IS ASSUMED THAT MIDDLE = ILO IN CASE IHI = ILO+1
+ IF (X.LT.XT(MIDDLE)) GO TO 80
+ ILO = MIDDLE
+ GO TO 70
+ 80 IHI = MIDDLE
+ GO TO 70
+C *** SET OUTPUT AND RETURN
+ 90 MFLAG = -1
+ ILEFT = 1
+ RETURN
+ 100 MFLAG = 0
+ ILEFT = ILO
+ RETURN
+ 110 MFLAG = 1
+ ILEFT = LXT
+ RETURN
+ END