-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathrtsafe.f
46 lines (46 loc) · 1.04 KB
/
rtsafe.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
FUNCTION RTSAFE(FUNCD,X1,X2,XACC)
PARAMETER (MAXIT=100)
CALL FUNCD(X1,FL,DF)
CALL FUNCD(X2,FH,DF)
IF(FL*FH.GE.0.) PAUSE 'root must be bracketed'
IF(FL.LT.0.)THEN
XL=X1
XH=X2
ELSE
XH=X1
XL=X2
SWAP=FL
FL=FH
FH=SWAP
ENDIF
RTSAFE=.5*(X1+X2)
DXOLD=ABS(X2-X1)
DX=DXOLD
CALL FUNCD(RTSAFE,F,DF)
DO 11 J=1,MAXIT
IF(((RTSAFE-XH)*DF-F)*((RTSAFE-XL)*DF-F).GE.0.
* .OR. ABS(2.*F).GT.ABS(DXOLD*DF) ) THEN
DXOLD=DX
DX=0.5*(XH-XL)
RTSAFE=XL+DX
IF(XL.EQ.RTSAFE)RETURN
ELSE
DXOLD=DX
DX=F/DF
TEMP=RTSAFE
RTSAFE=RTSAFE-DX
IF(TEMP.EQ.RTSAFE)RETURN
ENDIF
IF(ABS(DX).LT.XACC) RETURN
CALL FUNCD(RTSAFE,F,DF)
IF(F.LT.0.) THEN
XL=RTSAFE
FL=F
ELSE
XH=RTSAFE
FH=F
ENDIF
11 CONTINUE
PAUSE 'RTSAFE exceeding maximum iterations'
RETURN
END