aboutsummaryrefslogtreecommitdiff
path: root/pkg/utilities/nttools/trebin/tucspl.f
blob: 511211b899f620c7ce8f42f78c74772ccbb393f5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
subroutine tucspl (xa, ya, n, work, y2)
C
C  Compute the second derivative of YA at each point in the array.
C  This is the initialization needed in preparation for interpolating
C  using cubic splines by the subroutine TUISPL.  Input and output
C  are all double precision.
C
C  This routine was copied with slight modifications from the SPLINE
C  subroutine in Numerical Recipes by Press, Flannery, Teukolsky and
C  Vetterling.
C
C  N		i: number of elements in each array
C  XA		i: array of independent-variable values
C  YA		i: array of dependent-variable values
C  WORK		io: scratch array used for work space
C  Y2		o: second derivative of YA at each point
C
CH  Phil Hodge, 14-Apr-1988  Subroutine copied from Numerical Recipes SPLINE.
C
	integer n
	double precision xa(n), ya(n), work(n), y2(n)
C--
	integer i
	double precision p, sig

C  These values (and y2(n) = 0) are for a "natural" spline.
	y2(1) = 0.
	work(1) = 0.
C
C  This is the decomposition loop of the tridiagonal algorithm.
C  Y2 and WORK are used for temporary storage of the decomposed factors.
C
	do 10 i = 2, n-1
	    sig = (xa(i) - xa(i-1)) / (xa(i+1) - xa(i-1))
	    p = sig * y2(i-1) + 2.
	    y2(i) = (sig - 1.) / p
	    work(i) = (6. * ((ya(i+1) - ya(i)) / (xa(i+1) - xa(i))
     +			- (ya(i) - ya(i-1)) / (xa(i) - xa(i-1))) /
     +			(xa(i+1) - xa(i-1)) - sig * work(i-1)) / p
 10	continue

C					"natural" spline
	y2(n) = 0.
C
C  This is the backsubstitution loop of the tridiagonal algorithm.
C
	do 20 i = n-1, 1, -1
	    y2(i) = y2(i) * y2(i+1) + work(i)
 20	continue

	return
	end