www.pudn.com > Cwell.rar > bisect.f
* Copyright (c) Colorado School of Mines, 2007.
* All rights reserved.
SUBROUTINE BISECT(BETA,DELTAB,THETAC,SINTHR,PI,
: XSTART,XEND,TRUGEO,LREF,X,Z)
REAL X(0:*), Z(0:*), BETA, TRUGEO,
: XSTART, XEND, PI, DELTAB,
: THETAC, SINTHR
INTEGER LREF
cc local variables
c CLOSE a small number
c G the equation we're trying to solve
c G0 the value of g at the beginning of the search
c ITER1 first iteration counter
c ITER2 second iteration counter
c MAXIT max value for the iteration counters
c X1,X2 bisection points
REAL G, G0, X1, X2,
: CLOSE, XNEW
INTEGER ITER1, ITER2, MAXIT, NNEW
LOGICAL XFAIL
PARAMETER ( MAXIT = 1000,
: CLOSE = .01 )
XFAIL = .FALSE.
c initialise the iteration counters
ITER1 = 0
ITER2 = 0
G0 = 180. * ( THETAC - ASIN(ABS(SINTHR)) )/PI
IF(G0.EQ.0.) RETURN
G = G0
XFAIL = .FALSE.
c use bisection to approach solution
X2 = BETA - DELTAB
X1 = BETA
10 IF(ABS(X1-X2).GT.CLOSE) THEN
ITER2 = ITER2 + 1
IF(ITER2.GT.MAXIT) THEN
XFAIL = .TRUE.
WRITE(*,*)'max iter',ITER2
RETURN
END IF
XNEW = ( X1 + X2 ) / 2.
CALL SHOOT(X,Z,XNEW,PI,TRUGEO,NNEW,XSTART,XEND,
: LREF,SINTHR)
IF(NNEW.LE.LREF) XFAIL = .TRUE.
G = 180. * ( THETAC - ASIN(ABS(SINTHR)) )/PI
IF(XFAIL.OR.G.EQ.0.) THEN
c write(*,*)'xfail or 0'
RETURN
END IF
IF(G/G0.GT.0.) THEN
X1 = XNEW
ELSE
X2 = XNEW
END IF
GO TO 10
END IF
RETURN
END
*-----------------------------------------------------------------