-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathodeint.f
57 lines (57 loc) · 1.52 KB
/
odeint.f
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
SUBROUTINE ODEINT(YSTART,NVAR,X1,X2,EPS,H1,HMIN,NOK,NBAD,DERIVS,RK
*QC)
PARAMETER (MAXSTP=10000,NMAX=10,TWO=2.0,ZERO=0.0,TINY=1.E-30)
COMMON /PATH/ KMAX,KOUNT,DXSAV,XP(200),YP(10,200)
DIMENSION YSTART(NVAR),YSCAL(NMAX),Y(NMAX),DYDX(NMAX)
X=X1
H=SIGN(H1,X2-X1)
NOK=0
NBAD=0
KOUNT=0
DO 11 I=1,NVAR
Y(I)=YSTART(I)
11 CONTINUE
XSAV=X-DXSAV*TWO
DO 16 NSTP=1,MAXSTP
CALL DERIVS(X,Y,DYDX)
DO 12 I=1,NVAR
YSCAL(I)=ABS(Y(I))+ABS(H*DYDX(I))+TINY
12 CONTINUE
IF(KMAX.GT.0)THEN
IF(ABS(X-XSAV).GT.ABS(DXSAV)) THEN
IF(KOUNT.LT.KMAX-1)THEN
KOUNT=KOUNT+1
XP(KOUNT)=X
DO 13 I=1,NVAR
YP(I,KOUNT)=Y(I)
13 CONTINUE
XSAV=X
ENDIF
ENDIF
ENDIF
IF((X+H-X2)*(X+H-X1).GT.ZERO) H=X2-X
CALL RKQC(Y,DYDX,NVAR,X,H,EPS,YSCAL,HDID,HNEXT,DERIVS)
IF(HDID.EQ.H)THEN
NOK=NOK+1
ELSE
NBAD=NBAD+1
ENDIF
IF((X-X2)*(X2-X1).GE.ZERO)THEN
DO 14 I=1,NVAR
YSTART(I)=Y(I)
14 CONTINUE
IF(KMAX.NE.0)THEN
KOUNT=KOUNT+1
XP(KOUNT)=X
DO 15 I=1,NVAR
YP(I,KOUNT)=Y(I)
15 CONTINUE
ENDIF
RETURN
ENDIF
IF(ABS(HNEXT).LT.HMIN) PAUSE 'Stepsize smaller than minimum.'
H=HNEXT
16 CONTINUE
PAUSE 'Too many steps.'
RETURN
END