1      subroutine fpchec(x,m,t,n,k,ier)
2c  subroutine fpchec verifies the number and the position of the knots
3c  t(j),j=1,2,...,n of a spline of degree k, in relation to the number
4c  and the position of the data points x(i),i=1,2,...,m. if all of the
5c  following conditions are fulfilled, the error parameter ier is set
6c  to zero. if one of the conditions is violated ier is set to ten.
7c      1) k+1 <= n-k-1 <= m
8c      2) t(1) <= t(2) <= ... <= t(k+1)
9c         t(n-k) <= t(n-k+1) <= ... <= t(n)
10c      3) t(k+1) < t(k+2) < ... < t(n-k)
11c      4) t(k+1) <= x(i) <= t(n-k)
12c      5) the conditions specified by schoenberg and whitney must hold
13c         for at least one subset of data points, i.e. there must be a
14c         subset of data points y(j) such that
15c             t(j) < y(j) < t(j+k+1), j=1,2,...,n-k-1
16c  ..
17c  ..scalar arguments..
18      integer m,n,k,ier
19c  ..array arguments..
20      real*8 x(m),t(n)
21c  ..local scalars..
22      integer i,j,k1,k2,l,nk1,nk2,nk3
23      real*8 tj,tl
24c  ..
25      k1 = k+1
26      k2 = k1+1
27      nk1 = n-k1
28      nk2 = nk1+1
29      ier = 10
30c  check condition no 1
31      if(nk1.lt.k1 .or. nk1.gt.m) go to 80
32c  check condition no 2
33      j = n
34      do 20 i=1,k
35        if(t(i).gt.t(i+1)) go to 80
36        if(t(j).lt.t(j-1)) go to 80
37        j = j-1
38  20  continue
39c  check condition no 3
40      do 30 i=k2,nk2
41        if(t(i).le.t(i-1)) go to 80
42  30  continue
43c  check condition no 4
44      if(x(1).lt.t(k1) .or. x(m).gt.t(nk2)) go to 80
45c  check condition no 5
46      if(x(1).ge.t(k2) .or. x(m).le.t(nk1)) go to 80
47      i = 1
48      l = k2
49      nk3 = nk1-1
50      if(nk3.lt.2) go to 70
51      do 60 j=2,nk3
52        tj = t(j)
53        l = l+1
54        tl = t(l)
55  40    i = i+1
56        if(i.ge.m) go to 80
57        if(x(i).le.tj) go to 40
58        if(x(i).ge.tl) go to 80
59  60  continue
60  70  ier = 0
61  80  return
62      end
63