SUBROUTINE BINSRH(XBRK,YBRK,NBRK,X,Y) C IMPLICIT NONE C C THIS IS A BINARY SEARCH ALGORITHM C THE ALGORITHM LOCATES THE APPROPRIATE TABLE C ELEMENTS FOR THE ABSCISSA (XBRK), AND USES LINEAR C INTERPOLATION TO SOLVE FOR THE ORDINATE Y. C DOUBLE PRECISION XBRK(*),YBRK(*), X, Y DOUBLE PRECISION XMIN, XMAX INTEGER NBRK, NMAX, NMIN, NTOP, NBOT, NHALF EXTERNAL INTERPL C C CHECK FOR OVERRANGE ON THE TABLE C XMIN = XBRK(1) XMAX = XBRK(NBRK) IF(X.LT.XBRK(1).OR.X.GT.XBRK(NBRK)) THEN C c WRITE(99,100) XBRK(1),XBRK(NBRK),X PRINT100, XBRK(1),XBRK(NBRK),X 100 FORMAT(1X,'VALUE OF X IS OUTSIDE OF TABLE'/1X, +'XMIN,XMAX,X=',3(F11.4,1X)/) C IF(X.LT.XBRK(1) ) THEN WRITE(99,*) ' X LESS THAN XMIN TABLE VALUE' WRITE(99,*) 'VALUE OF XMIN IS USED' X=XMIN ELSE WRITE(99,*) ' X GREATER THAN XMAX TABLE VALUE' WRITE(99,*) ' VALUE OF XMAX IS USED' X=XMAX ENDIF C ENDIF C NOTE: TABLE MUST BE IN ASCENDING ORDER FOR THE C ABSCISSA C C INITIALIZE NBOT=1 NTOP=NBRK C C BEGIN SEARCH C 10 NHALF=(NTOP-NBOT)/2+NBOT IF(XBRK(NBOT).LE.X.AND.X.LE.XBRK(NHALF)) THEN C NBOT=NBOT NTOP=NHALF C ELSE C NBOT=NHALF NTOP=NTOP C ENDIF IF((NBOT+1).LT.NTOP) THEN GO TO 10 ENDIF C C INTERPOLATE OFF OF RESULTS NMAX=NTOP NMIN=NBOT C CALL INTERPL(XBRK,YBRK,NMIN,NMAX,X,Y) C 99 CONTINUE C RETURN END C C C SUBROUTINE INTERPL(XBRK,YBRK,NMIN,NMAX,X,Y) C IMPLICIT NONE C C SUBROUTINE PERFORMS LINEAR INTERPOLATION ON THE INPUT C ARRAY'S--XBRK ARE THE ABSCISSA AND YBRK ARE C THE ORDINATE DOUBLE PRECISION XBRK(*),YBRK(*), X, Y, X1, X2, Y1, Y2, SLOPE INTEGER NMIN, NMAX C X1=XBRK(NMIN) X2=XBRK(NMAX) C Y1=YBRK(NMIN) Y2=YBRK(NMAX) C SLOPE=(Y2-Y1)/(X2-X1) Y=(X-X1)*SLOPE+Y1 C RETURN END C C C