This repository was archived by the owner on Apr 28, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdivdifdouble.f
More file actions
98 lines (98 loc) · 2.65 KB
/
Copy pathdivdifdouble.f
File metadata and controls
98 lines (98 loc) · 2.65 KB
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
double precision FUNCTION dDIVDIF(F,A,NN,X,MM)
c F=y points, A=x points, NN=Number of points
c X=Point where interpolation is evaluated, MM=degree of interpolation.
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
DIMENSION A(NN),F(NN),T(20),D(20)
LOGICAL EXTRA
LOGICAL MFLAG,RFLAG
DATA MMAX/10/
C
C TABULAR INTERPOLATION USING SYMMETRICALLY PLACED ARGUMENT POINTS.
C
C START. FIND SUBSCRIPT IX OF X IN ARRAY A.
IF( (NN.LT.2) .OR. (MM.LT.1) ) GO TO 20
N=NN
M=MIN0(MM,MMAX,N-1)
MPLUS=M+1
IX=0
IY=N+1
IF(A(1).GT.A(N)) GO TO 4
C (SEARCH INCREASING ARGUMENTS.)
1 MID=(IX+IY)/2
IF(X.GE.A(MID)) GO TO 2
IY=MID
GO TO 3
C (IF TRUE.)
2 IX=MID
3 IF(IY-IX.GT.1) GO TO 1
GO TO 7
C (SEARCH DECREASING ARGUMENTS.)
4 MID=(IX+IY)/2
IF(X.LE.A(MID)) GO TO 5
IY=MID
GO TO 6
C (IF TRUE.)
5 IX=MID
6 IF(IY-IX.GT.1) GO TO 4
C
C COPY REORDERED INTERPOLATION POINTS INTO (T(I),D(I)), SETTING
C *EXTRA* TO TRUE IF M+2 POINTS TO BE USED.
7 NPTS=M+2-MOD(M,2)
IP=0
L=0
GO TO 9
8 L=-L
IF(L.GE.0) L=L+1
9 ISUB=IX+L
IF((1.LE.ISUB).AND.(ISUB.LE.N)) GO TO 10
C (SKIP POINT.)
NPTS=MPLUS
GO TO 11
C (INSERT POINT.)
10 IP=IP+1
T(IP)=A(ISUB)
D(IP)=F(ISUB)
11 IF(IP.LT.NPTS) GO TO 8
EXTRA=NPTS.NE.MPLUS
C
C REPLACE D BY THE LEADING DIAGONAL OF A DIVIDED-DIFFERENCE TABLE, SUP-
C PLEMENTED BY AN EXTRA LINE IF *EXTRA* IS TRUE.
DO 14 L=1,M
IF(.NOT.EXTRA) GO TO 12
ISUB=MPLUS-L
D(M+2)=(D(M+2)-D(M))/(T(M+2)-T(ISUB))
12 I=MPLUS
DO 13 J=L,M
ISUB=I-L
D(I)=(D(I)-D(I-1))/(T(I)-T(ISUB))
I=I-1
13 CONTINUE
14 CONTINUE
C
C EVALUATE THE NEWTON INTERPOLATION FORMULA AT X, AVERAGING TWO VALUES
C OF LAST DIFFERENCE IF *EXTRA* IS TRUE.
SUM=D(MPLUS)
IF(EXTRA) SUM=0.5*(SUM+D(M+2))
J=M
DO 15 L=1,M
SUM=D(J)+(X-T(J))*SUM
J=J-1
15 CONTINUE
dDIVDIF=SUM
RETURN
C
20 CALL KERMTR('E105.1',LGFILE,MFLAG,RFLAG)
IF(MFLAG) THEN
IF(LGFILE.EQ.0) THEN
IF(MM.LT.1) WRITE(*,101) MM
IF(NN.LT.2) WRITE(*,102) NN
ELSE
IF(MM.LT.1) WRITE(LGFILE,101) MM
IF(NN.LT.2) WRITE(LGFILE,102) NN
ENDIF
ENDIF
IF(.NOT.RFLAG) CALL ABEND
RETURN
101 FORMAT( 7X, 'FUNCTION dDIVDIF ... M =',I6,' IS LESS THAN 1')
102 FORMAT( 7X, 'FUNCTION dDIVDIF ... N =',I6,' IS LESS THAN 2')
END