V3FIT
nspline.f
1 C******************** START FILE SPLINE.FOR ; GROUP TRKRLIB ******************
2 CC
3 CCCCCCCCCCCCCCCC
4 C THE CODES (SPLINE & SEVAL) ARE TAKEN FROM:
5 C FORSYTHE,MALCOLM AND MOLER, "COMPUTER METHODS FOR
6 C MATHEMATICAL COMPUTATIONS",PRENTICE-HALL, 1977.
7 C
8 C THE CODES (SPLEEN,SPLAAN & SPEVAL) ARE ADAPTATIONS
9 C BY R.M. WIELAND FOR SPECIAL CASES ... SEE COMMENTS
10 c
11 c this is nspline -- natural cubic spline
12 c second derivative of interpolant set to zero at endpts
13 c
14 
15  SUBROUTINE nspline (N, X, Y, B, C, D)
16  INTEGER N
17  REAL X(N), Y(N), B(N), C(N), D(N)
18 C
19 C THE COEFFICIENTS B(I), C(I), AND D(I), I=1,2,...,N ARE COMPUTED
20 C FOR A CUBIC INTERPOLATING SPLINE
21 C
22 C S(X) = Y(I) + B(I)*(X-X(I)) + C(I)*(X-X(I))**2 + D(I)*(X-X(I))**3
23 C
24 C FOR X(I) .LE. X .LE. X(I+1)
25 C
26 C INPUT..
27 C
28 C N = THE NUMBER OF DATA POINTS OR KNOTS (N.GE.2)
29 C X = THE ABSCISSAS OF THE KNOTS IN STRICTLY INCREASING ORDER
30 C Y = THE ORDINATES OF THE KNOTS
31 C
32 C OUTPUT..
33 C
34 C B, C, D = ARRAYS OF SPLINE COEFFICIENTS AS DEFINED ABOVE.
35 C
36 C USING P TO DENOTE DIFFERENTIATION,
37 C
38 C Y(I) = S(X(I))
39 C B(I) = SP(X(I))
40 C C(I) = SPP(X(I))/2
41 C D(I) = SPPP(X(I))/6 (DERIVATIVE FROM THE RIGHT)
42 C
43 CCCCCCCCCCCCCCC
44 C THE ACCOMPANYING FUNCTION SUBPROGRAM SEVAL CAN BE USED
45 C TO EVALUATE THE SPLINE.
46 C
47 C
48  INTEGER NM1, NM2, IB, I
49  REAL T
50 C
51  nm1 = n-1
52  IF ( n .LT. 2 ) RETURN
53 C
54 C
55 C DMC - CHECK ORDINATES
56  DO 5 i=1,nm1
57  ip1=i+1
58  IF(x(ip1).LE.x(i)) then
59  write(6,9000)
60  write(6,9001) (x(ii),ii=1,n)
61  zbomb=sqrt(-1.0/(x(1)*x(1)))
62  write(6,*) zbomb
63  write(6,*) ' nspline -- code stop.'
64  call exit(1)
65  9000 FORMAT(/
66  >' ? UNORDERED ORDINATE ARRAY PASSED TO SPLINE SUBROUTINE:')
67  9001 FORMAT(1x,5(1x,1pe12.5))
68  endif
69  5 CONTINUE
70 C
71  IF ( n .LT. 3 ) GO TO 50
72 C
73 C SET UP TRIDIAGONAL SYSTEM
74 C
75 C B = DIAGONAL, D = OFFDIAGONAL, C = RIGHT HAND SIDE.
76 C
77  d(1) = x(2) - x(1)
78  c(2) = (y(2) - y(1))/d(1)
79  DO 10 i = 2, nm1
80  d(i) = x(i+1) - x(i)
81  b(i) = 2.*(d(i-1) + d(i))
82  c(i+1) = (y(i+1) - y(i))/d(i)
83  c(i) = c(i+1) - c(i)
84  10 CONTINUE
85 C
86 C END CONDITIONS: 2nd deriv = 0 at endpts; solve reduced n-2 x n-2
87 C system.
88  c(1) = 0.
89  c(n) = 0.
90 C
91 C FORWARD ELIMINATION
92 C
93  15 DO 20 i = 3, nm1
94  t = d(i-1)/b(i-1)
95  b(i) = b(i) - t*d(i-1)
96  c(i) = c(i) - t*c(i-1)
97  20 CONTINUE
98 C
99 C BACK SUBSTITUTION
100 C
101  nm2=nm1-1
102  c(nm1) = c(nm1)/b(nm1)
103  DO 30 ib = 2, nm2
104  i = n-ib
105  c(i) = (c(i) - d(i)*c(i+1))/b(i)
106  30 CONTINUE
107 C
108 C C(I) IS NOW THE SIGMA(I) OF THE TEXT
109 C
110 C COMPUTE POLYNOMIAL COEFFICIENTS
111 C
112  b(n) = (y(n) - y(nm1))/d(nm1) + d(nm1)*(c(nm1) + 2.*c(n))
113  DO 40 i = 1, nm1
114  b(i) = (y(i+1) - y(i))/d(i) - d(i)*(c(i+1) + 2.*c(i))
115  d(i) = (c(i+1) - c(i))/d(i)
116  c(i) = 3.*c(i)
117  40 CONTINUE
118  c(n) = 3.*c(n)
119  d(n) = d(n-1)
120  RETURN
121 C
122  50 b(1) = (y(2)-y(1))/(x(2)-x(1))
123  c(1) = 0.
124  d(1) = 0.
125  b(2) = b(1)
126  c(2) = 0.
127  d(2) = 0.
128  RETURN
129  END
130 C******************** END FILE SPLINE.FOR ; GROUP TRKRLIB ******************