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