SUBROUTINE ZBRENT(FUNC,X1,X2,ZERO,TOL,EPS,ITMAX,ITER1) IMPLICIT DOUBLE PRECISION(A-H,O-Z) EXTERNAL FUNC A=X1 B=X2 FA=FUNC(A) FB=FUNC(B) IF((FA.GT.0D0.AND.FB.GT.0D0).OR.(FA.LT.0D0.AND.FB.LT.0D0))PAUSE *'ROOT MUST BE BRACKETED FOR ZBRENT' C=B FC=FB DO 11 ITER=1,ITMAX IF((FB.GT.0D0.AND.FC.GT.0D0).OR.(FB.LT.0D0.AND.FC.LT.0D0))THEN C=A FC=FA D=B-A E=D ENDIF IF(DABS(FC).LT.DABS(FB)) THEN A=B B=C C=A FA=FB FB=FC FC=FA ENDIF TOL1=2D0*EPS*DABS(B)+0.5D0*TOL XM=.5D0*(C-B) IF(DABS(XM).LE.TOL1 .OR. FB.EQ.0D0)THEN ZERO=B ITER1=ITER RETURN ENDIF IF(DABS(E).GE.TOL1 .AND. DABS(FA).GT.DABS(FB)) THEN S=FB/FA IF(A.EQ.C) THEN P=2.*XM*S Q=1.-S ELSE Q=FA/FC R=FB/FC P=S*(2D0*XM*Q*(Q-R)-(B-A)*(R-1D0)) Q=(Q-1D0)*(R-1D0)*(S-1D0) ENDIF IF(P.GT.0D0) Q=-Q P=DABS(P) IF(2D0*P .LT. DMIN1(3D0*XM*Q-DABS(TOL1*Q),DABS(E*Q))) THEN E=D D=P/Q ELSE D=XM E=D ENDIF ELSE D=XM E=D ENDIF A=B FA=FB IF(DABS(D) .GT. TOL1) THEN B=B+D ELSE B=B+DSIGN(TOL1,XM) ENDIF FB=FUNC(B) 11 CONTINUE PAUSE 'ZBRENT EXCEEDING MAXIMUM ITERATIONS' ZERO=B ITER1=ITER RETURN END