C ALGORITHM 420 COLLECTED ALGORITHMS FROM ACM. C ALGORITHM APPEARED IN COMM. ACM, VOL. 15, NO. 02, C P. 100. C THIS DRIVER ROUTINE FOR HIDE PRODUCES THE GRAPH TITLED 10 C TEST FOR PLOTTING ROUTINE HIDE. 20 C 30 DIMENSION X(150),Y(150),Y1(150),XG(500),G(500),XH(500) 40 1 ,H(500),XG1(500),G1(500),TI(14) 50 DATA NG,NG1,N,N1,NFNS,MAXDIM,XMIN,DELTAX,YMIN,DELTAY, 60 1 XLNTH,YLNTH,XX/0,-3,150,-150,26,500,0.,1.05,-1., 70 2 .67,-6.,-3.,3.141592654/ 80 EQUIVALENCE (XH(1),TI(1)) 90 READ 1,TI 100 1 FORMAT(13A6,A2) 110 STEP = 3.141592654/74.5 120 X(1) = 0. 130 Y1(1) = 0. 140 DO 2 I = 2,N 150 X(I) = X(I-1)+STEP 160 2 Y1(I) = .2*SIN(X(I)) 170 Z = 0. 180 STEP = 3.141592654/12.5 190 C 200 C THE CALLS TO HIDE NECESSARY TO PLOT THE TOP AND BOTTOM 210 C (UNDERSIDE) OF A SURFACE ARE MADE IN THE FOLLOWING LOOP. 220 C 230 DO 3 I = 1,NFNS 240 CZ = COS(Z) 250 DO 4 J = 1,N 260 4 Y(J) = Y1(J)*CZ-(EXP(-(X(J)-XX)**2-(Z-XX)**2)* 270 1 COS(1.75*((X(J)-XX)**2+(Z-XX)**2)))*1.5 280 C 290 C PLOT THE PART OF THE ITH CURVE THAT LIES ON THE UNHIDDEN 300 C PART OF THE TOP OF THE SURFACE. 310 C 320 CALL HIDE(X,Y,XG,G,XH,H,NG,MAXDIM,N,NFNS,TI,XLNTH, 330 1 YLNTH,XMIN,DELTAX,YMIN,DELTAY) 340 C 350 C PLOT THE PART OF THE ITH CURVE THAT LIES ON THE UNHIDDEN 360 C PART OF THE UNDERSIDE OF THE SURFACE. 370 C (NOTE. IF PART OF THE UNDERSIDE FALLS BELOW YMIN, BUT 380 C STAYS WITHIN THE DESIRED AREA ON THE PLOT, HIDE WILL STILL 390 C PERFORM THE PLOTTING CORRECTLY.) 400 C 410 CALL HIDE(X,Y,XG1,G1,XH,H,NG1,MAXDIM,N1,0,6HNOTTLE, 420 1 XLNTH,YLNTH,XMIN,DELTAX,YMIN,DELTAY) 430 3 Z = Z+STEP 440 C 450 C CALL SYSTEMS ROUTINES TO MOVE THE PEN OFF THE GRAPH TO THE 460 C RIGHT AND TO TERMINATE THE PLOT. 470 C 480 CALL MOVPEN(10.,-2.,-3) 490 CALL PLTOFF 500 END 510 SUBROUTINE HIDE(X,Y,XG,G,XH,H,NG,MAXDIM,N1,NFNS,TITLE, HIDE 520 1 XLNTH,YLNTH,XMIN,DELTAX,YMIN,DELTAY) C C THIS SUBROUTINE PRODUCES A 2-DIMENSIONAL REPRESENTATION OF C A 3-DIMENSIONAL FIGURE OR SURFACE. C THE FIRST CALL TO HIDE IS FOR INITIALIZATION AND PLOTTING C THE CURVE FARTHEST IN THE FOREGROUND. ON EACH SUBSEQUENT C CALL, A CURVE FARTHER IN THE BACKGROUND IS PLOTTED. C X IS THE ABCISSA ARRAY FOR THE CURVE TO BE PLOTTED BY C HIDE ON THIS CALL. THE X VALUES MUST BE INCREASING. C IF X(I) GE X(I+1) FOR SOME I, MAXDIM WILL BE SET TO ZERO, C AND A RETURN WILL BE EXECUTED. C Y IS THE ORDINATE ARRAY. C G VS. XG IS THE CURRENT VISUAL MAXIMUM FUNCTION ON EACH C RETURN FROM HIDE. C XH AND H ARE WORKING ARRAYS. C ON EACH RETURN FROM HIDE, NG IS THE NUMBER OF POINTS IN C THE CURRENT MAXIMUM FUNCTION. C ON THE FIRST CALL, NG IS A NONPOSITIVE INTEGER WHICH C SPECIFIES CERTAIN OPTIONS. C -1 DO NOT DRAW THE 8 1/2 BY 11 INCH BORDER. C -2 PLOT UNHIDDEN MINIMUM RATHER THAN MAXIMUM. IN THIS C CASE, G VS. XG WILL BE THE NEGATIVE OF THE VISUAL C MINIMUM FUNCTION. C -3 DO NOT PLOT BORDER, PLOT MINIMUM RATHER THAN MAXIMUM. C 0 PLOT BORDER, PLOT MAXIMUM. C IF THE BORDER IS DRAWN, ITS LEFT, BOTTOM CORNER WILL BE C WHERE THE PLOTTING REFERENCE POINT WAS JUST BEFORE THE C FIRST CALL TO HIDE, AND THE REFERENCE POINT WILL BE MOVED C 1 INCH RIGHT AND 2 INCHES UP. IF THE BORDER IS NOT DRAWN, C THE REFERENCE POINT WILL NOT BE MOVED BY HIDE. C MAXDIM IS THE DIMENSION IN THE CALLING PROGRAM OF THE C ARRAYS XG, G, XH, AND H. IF ONE OF THESE ARRAYS WOULD C HAVE BEEN OVERFLOWED, MAXDIM IS SET EQUAL TO ITS NEGATIVE, C AND A RETURN IS EXECUTED. C N1 IS THE NUMBER OF POINTS (X(I),Y(I)) TO BE PLOTTED IN C A GIVEN CALL TO HIDE. C IF N1 IS LESS THAN 0, Y VS. X WILL NOT BE PLOTTED, BUT ON C SUBSEQUENT CALLS, PLOTTING WILL BE DONE AS IF C ((X(I),Y(I)),I=1,-N1) HAD BEEN PLOTTED (WHERE UNHIDDEN). C N1 WILL BE RETURNED AS ITS ABSOLUTE VALUE. C NFNS IS THE TOTAL NO. OF CURVES TO BE PLOTTED FOR THIS C GRAPH IF TRANSLATING THE ARRAYS TO SIMULATE STEPPING IN C THE DEPTH DIMENSION IS DESIRED. IF NO TRANSLATION IS C DESIRED, NFNS SHOULD BE NEGATIVE. IF THE SAME TRANSLATION C AS IN THE PREVIOUS CALL TO HIDE IS DESIRED, NFNS SHOULD BE C ZERO. THE NFNS=0 OPTION MAY BE SPECIFIED FOR INDIVIDUAL C CURVES AFTER THE FIRST FOR A GIVEN GRAPH. ALL C TRANSLATIONS WHICH ARE PERFORMED WILL HAVE EQUAL STEP SIZE C DETERMINED BY THE VALUES IN THE INITIAL CALL FOR XLNTH, C YLNTH, AND NFNS. C TITLE IS AN 80-CHARACTER TITLE. C IF TITLE(1)=6HNOTTLE, THE TITLE WILL NOT BE PLOTTED. C TITLE(1) AND XH(1) OR H(1) MAY BE THE SAME LOCATION IF THE C TITLE IS NOT NEEDED AFTER IT IS PLOTTED. C XLNTH IS THE LENGTH IN INCHES OF THE HORIZONTAL AXIS. C IF XLNTH IS LESS THAN 0, THE X-AXIS AND THE DEPTH AXIS C WILL NOT BE DRAWN. IN ANY CASE, UNLESS THIS OPTION IS C SUPPRESSED THROUGH NFNS, THE ITH CURVE WILL BE TRANSLATED C (I-1)*(9.-ABS(XLNTH))/(NFNS-1) INCHES TO THE LEFT. THIS C PLUS A SIMILAR VERTICAL TRANSLATION IS DONE TO SIMULATE C STEPPING IN THE DEPTH DIMENSION. C XMIN-(9.-ABS(XLNTH))*DELTAX WILL BE THE ABCISSA VALUE AT C THE PLOTTING REFERENCE POINT (WHICH IS WHERE THE C HORIZONTAL AND VERTICAL AXES WOULD INTERSECT IF DRAWN). C YLNTH IS THE LENGTH OF THE VERTICAL AXIS IN INCHES. C IF YLNTH IS LESS THAN 0, THE VERTICAL AND DEPTH AXES WILL C NOT BE DRAWN. BUT IN ANY CASE, UNLESS THIS OPTION IS C SUPPRESSED THROUGH NFNS, THE ITH CURVE WILL BE TRANSLATED C (I-1)*(6.-ABS(YLNTH))/(NFNS-1) INCHES UP TO SIMULATE C STEPPING IN THE DEPTH DIMENSION. YMIN-(6.-ABS(YLNTH))* C DELTAY WILL BE THE ORDINATE VALUE AT THE PLOTTING C REFERENCE POINT. C IF TRANSLATIONS ARE PERFORMED, X AND Y WILL BE RESTORED TO C THEIR ORIGINAL VALUES BEFORE THE RETURN TO THE CALLING C PROGRAM. C NOTE THAT IF ABS(XLNTH)=9, AND ABS(YLNTH)=6, THERE WILL BE C NO TRANSLATION, AND, IF BORDER AND AXES ARE NOT DRAWN, THE C DIMENSIONS OF THE PLOT ARE UNSPECIFIED. C IF THE AXES AND BORDER ARE DRAWN, THE TOP OF THE VERTICAL C AXIS AND THE RIGHT END OF THE HORIZONTAL AXIS ARE FIXED C RELATIVE TO THE BORDER, AND THE DEPTH AXIS JOINS THE LEFT C END OF THE HORIZONTAL AXIS AND THE BOTTOM OF THE VERTICAL AXIS. C XMIN IS A LOWER BOUND FOR X. C DELTAX IS THE X DATA INCREMENT PER INCH FOR THE PLOT. C XMIN AND DELTAX DETERMINE THE PLOTTING SCALE FOR X. C (SEE ABOVE.) C YMIN AND DELTAY, SIMILARLY, DETERMINE THE SCALE FOR Y. C IF AN ERROR RETURN IS MADE FROM HIDE, ALL FURTHER CALLS C WILL RESULT ONLY IN THE EXECUTION OF A RETURN UNLESS C MAXDIM IS RESET TO A POSITIVE VALUE. C DIMENSION X(1),Y(1),XG(1),G(1),H(1),XH(1),TITLE(1) INTEGER TITLE C C THE ONLY PURPOSE OF THE FOLLOWING EQUIVALENCE STATEMENT IS C TO SAVE STORAGE. EQUIVALENCE (K1,IWHICH),(K2,SLOPE),(FNSM1,Z1), 1 (IGGP1,K1),(K1,N2) C C EPS1 IS THE RELATIVE ABCISSA INCREMENT USED TO SIMULATE C DISCONTINUITIES IN THE MAXIMUM FUNCTION. DATA EPS1/.000001/ DATA NOTTLE/6HNOTTLE/ C C THE FOLLOWING STATEMENT FUNCTION COMPUTES THE ORDINATE ON C THE LINE JOINING (XI,YI) AND (XIP1,YIP1) CORRESPONDING TO C THE ABCISSA XX. F(XX,XI,YI,XIP1,YIP1) = YI+(XX-XI)*(YIP1-YI)/(XIP1-XI) IF(MAXDIM.LE.0) RETURN DO 71 I = 2,N1 IF(X(I-1).LT.X(I)) GO TO 71 MAXDIM = 0 GO TO 75 71 CONTINUE IFPLOT = 1 IF(N1.GT.0) GO TO 76 N1 = -N1 IFPLOT = 0 76 IF(NG.GT.0) GO TO 5000 IF(N1+4.LE.MAXDIM) GO TO 74 MAXDIM = -MAXDIM 75 RETURN C C WE WANT SIGN = 1 IF WE ARE PLOTTING MAXIMUM, = -1 IF C MINIMUM. 74 SIGN = 1. IF(NG.LT.-1) SIGN = -1. C C THE KTH CURVE TO BE PLOTTED WILL (OPTIONALLY) BE C TRANSLATED BY THE VECTOR (-DXIN,DYIN)*(K-1) TO SIMULATE C STEPPING IN THE DEPTH DIMENSION. IF(NFNS.LE.0) GO TO 46 FNSM1 = NFNS-1 DXIN = (9.-ABS(XLNTH))*DELTAX/FNSM1 DYIN = (6.-ABS(YLNTH))*DELTAY/FNSM1 C C SYSTEMS ROUTINE MOVPEN MOVES THE PEN TO A POINT WHOSE C COORDINATES ARE SPECIFIED IN INCHES BY THE FIRST TWO C PARAMETERS. THE PEN IS PICKED UP IF THE ABSOLUTE VALUE OF C THE THIRD PARAMETER IS 3, IS PUT DOWN IF 2, AND IS LEFT AS C AFTER LAST CALL IF 1. IF THE THIRD PARAMETER IS NEGATIVE, C A NEW REFERENCE POINT WILL BE ESTABLISHED. 46 IF(NG.EQ.-1.OR.NG.EQ.-3) GO TO 41 C C DRAW 8 1/2 BY 11 INCH BORDER. C ********************************************************** CALL MOVPEN(11.,0.,2) CALL MOVPEN(11.,8.5,1) CALL MOVPEN(0.,8.5,1) CALL MOVPEN(0.,0.,1) CALL MOVPEN(1.,2.0,-3) C C CALL SYSTEMS ROUTINE TO PLOT THE 80-CHARACTER TITLE. C THE FIRST TWO ARGUMENTS ARE THE COORDINATES IN INCHES C RELATIVE TO THE REFERENCE POINT OF THE LOWER LEFT-HAND C CORNER OF THE FIRST CHARACTER. THE THIRD ARGUMENT C DETERMINES THE HEIGHT IN INCHES OF THE CHARACTERS. THE C FIFTH ARGUMENT GIVES THE ANGLE RELATIVE TO HORIZONTAL OF C THE PLOTTED CHARACTERS. C ********************************************************** 41 IF(TITLE(1).NE.NOTTLE) CALL PSYMB(-.28,-1.,.14, 1 TITLE,0.,80) IF(XLNTH.LT.0.) GO TO 42 C C CALL SYSTEMS ROUTINE TO DRAW THE HORIZONTAL AXIS. THE C LEFT END IS SPECIFIED IN INCHES RELATIVE TO THE REFERENCE C POINT BY THE FIRST TWO ARGUMENTS. C ********************************************************** CALL PAXIS(9.-XLNTH,0.,1H ,-1,XLNTH,0.,XMIN,DELTAX) IF(YLNTH.LT.0.) GO TO 43 C C DRAW THE DEPTH AXIS. C ********************************************************** CALL MOVPEN(9.-XLNTH,0.,3) CALL MOVPEN(0.,6.-YLNTH,2) 42 IF(YLNTH.LT.0.) GO TO 43 C C DRAW THE VERTICAL AXIS. THE BOTTOM POINT IS SPECIFIED IN C INCHES RELATIVE TO THE REFERENCE POINT BY THE FIRST TWO C ARGUMENTS. C ********************************************************** CALL PAXIS(0.,6.-YLNTH,1H ,1,YLNTH,90.,YMIN,DELTAY) C C CURVES SUCCESSIVELY FARTHER IN THE BACKGROUND WILL BE C PLOTTED WHERE THEY ARE NOT HIDDEN BY G VS. XG. G VS XG C WILL BE UPDATED EACH TIME A NEW CURVE IS DRAWN AND WILL BE C THE VISUAL MAXIMUM (OR MINIMUM) FUNCTION OF THE CURVES C ALREADY PLOTTED. 43 INDEXT=3 DO 3 J = 1,N1 XG(INDEXT) = X(J) G(INDEXT) = SIGN*Y(J) 3 INDEXT = INDEXT+1 C C THE FOLLOWING PRECAUTIONARY STEP IS USED IN PLACE OF A C TEST IN SUBROUTINE LOOKUP TO SEE IF THE VALUE FOR WHICH WE C WANT AN INDEX IS OUTSIDE THE TABLE. C THE LAST XG VALUE WILL BE SET EQUAL TO THE LAST ABCISSA C OF THE CURVE TO BE PLOTTED IN THE NEXT CALL TO HIDE. EPS = EPS1*(ABS(XMIN)+ABS(DELTAX)) NG = N1+4 XG(1) = -FNSM1*DXIN+XMIN-ABS(XMIN)-ABS(XG(3))-1. XG(2) = XG(3)-EPS XG(N1+3) = XG(N1+2)+EPS ZZ=YMIN IF(SIGN.LT.0.) ZZ = -YMIN-50.*DELTAY G(1) = ZZ G(2) = ZZ G(N1+3) = ZZ G(NG) = ZZ C C CALL SYSTEMS ROUTINE TO PRODUCE A LINE PLOT OF C (X(I),Y(I),I=1,N1) - THIS IS THE CURVE FARTHEST IN THE C FOREGROUND. C XSTART IS THE X VALUE AT THE REFERENCE POINT. XSTART = XMIN-(9.-ABS(XLNTH))*DELTAX C IF(IFPLOT.EQ.1) CALL PDATA(X,Y,N1,0,1,XSTART,DELTAX, 1 YMIN,DELTAY,.07) DXKK = 0. DYKK = 0. RELINC = DELTAX/DELTAY XG(NG) = SIGN RETURN C C STATEMENT 5000 IS REACHED IF ANY EXCEPT THE CURVE FARTHEST C IN THE FOREGROUND IS TO BE PLOTTED. 5000 SIGN = XG(NG) XG(NG) = X(N1) C C TRANSLATE THE ARRAYS BEFORE PLOTTING TO SIMULATE STEPPING C IN THE DEPTH DIMENSION. IF(NFNS) 52,48,49 49 DXKK = DXKK+DXIN DYKK = DYKK+DYIN 48 DO 4 J = 1,N1 Y(J) = SIGN*(Y(J)+DYKK) 4 X(J) = X(J)-DXKK 52 CALL LOOKUP(X(1),XG(1),JJ) IF(JJ.GE.MAXDIM) GO TO 700 DO 31 J = 1,JJ XH(J) = XG(J) 31 H(J) = G(J) IG = JJ+1 XH(IG) = X(1) H(IG) = F(X(1),XG(JJ),G(JJ),XG(IG),G(IG)) C C WE WILL BE MAKING TABLE LOOKUPS FOR AN INCREASING SEQUENCE C OF NUMBERS - THEREFORE, WE DO NOT HAVE TO SEARCH FROM THE C FIRST OF THE (XG AND X) TABLES EACH TIME. HENCE INDEXG C AND INDEXT. INDEXG = JJ INDEXT = 1 Z1 = X(1) F1 = H(IG)-Y(1) IT = 2 JJ = IG IF(H(IG).GE.Y(1)) GO TO 32 IF(JJ.GE.MAXDIM) GO TO 700 JJ = IG+1 H(JJ) = Y(1) XH(JJ) = Z1+EPS 32 LAST = 0 X1 = Z1 C C FIND THE FIRST ZERO, Z2, OF THE FUNCTION G-Y TO THE RIGHT C OF Z1. 1100 IF(XG(IG).LT.X(IT)) GO TO 1001 C C DO NOT JUMP IF WE ARE TO LOOK FOR A ZERO BETWEEN X1 AND C X(I). IWHICH = 0 X2 = X(IT) F2 = F(X2,XG(IG-1),G(IG-1),XG(IG),G(IG))-Y(IT) IT = IT+1 GO TO 1002 C C COME TO 1001 IF WE ARE TO LOOK FOR A ZERO BETWEEN X1 AND C XG(IG). 1001 X2 = XG(IG) IWHICH = 1 F2 = G(IG)-F(X2,X(IT-1),Y(IT-1),X(IT),Y(IT)) IG = IG+1 C C THE FUNCTION (G-Y) HAS A ZERO Z2 SUCH THAT X1 LE Z2 LE X2 C IF AND ONLY IF (G-Y AT X1) * (G-Y AT X2) LE 0. C (G-Y IS ASSUMED, FOR PLOTTING PURPOSES, TO BE LINEAR ON C EACH INTERVAL (X1,X2).) 1002 IF(F1*F2.GT.0.) GO TO 1005 SLOPE = (F2-F1)/(X2-X1) IGG = IG-1-IWHICH ITT = IT-2+IWHICH IF(ABS(SLOPE*RELINC).GT.1.E-6) GO TO 1007 C C IF G AND Y DIFFER IMPERCEPTIBLY (FOR PLOTTING PURPOSES) C ON THE INTERVAL (X1,X2), SET Z2=X2. THIS STEP PREVENTS C DIVISION BY ZERO. Z2 = X2 GO TO 1006 C C OTHERWISE, COMPUTE THE ZERO Z2. 1007 Z2 = X1-F1/SLOPE GO TO 1006 C C IF NO ZERO WAS FOUND BETWEEN X1 AND X2, CONTINUE THE C SEARCH FOR ZEROES. 1005 X1 = X2 F1 = F2 IF(IT.LE.N1) GO TO 1100 C C IF THE END OF THE X TABLE HAS BEEN REACHED, CONSIDER THE C INTERVAL FROM THE LAST ZERO FOUND TO THE END OF THE X C TABLE (PLOT, UPDATE MAXIMUM FUNCTION AS INDICATED). 1008 LAST = 1 Z2 = X(N1) CALL LOOKUP(Z2,XG(INDEXG),IGG) IGG = INDEXG+IGG-1 ITT = N1-1 C C IT IS NECESSARY TO PLOT Y VS. X ON THE INTERVAL (Z1,Z2) C ONLY IF Y IS UNHIDDEN AT EACH ZZ SUCH THAT Z1 LT ZZ LT Z2. C WE CHOOSE ZZ NEAR THE LEFT END OF THE INTERVAL FOR C EFFICIENCY IN THE TABLE LOOKUP. C NOTE THAT IT IS MORE EFFICIENT TO CHOOSE THIS VALUE FOR ZZ C THAN, SAY, .99*X(INDEXT)+.01*X(INDEXT+1), WHICH WOULD C ELIMINATE ONE OF THE TWO TABLE LOOKUPS, BUT WOULD C NECESSITATE A TEST TO DETERMINE IF ZZ WAS BETWEEN Z1 AND C Z2. 1006 ZZ = .99*Z1+.01*Z2 CALL LOOKUP(ZZ,X(INDEXT),K1) CALL LOOKUP(ZZ,XG(INDEXG),K2) K1 = K1+INDEXT-1 K2 = K2+INDEXG-1 IF(F(ZZ,X(K1),Y(K1),X(K1+1),Y(K1+1)).GT. 1 F(ZZ,XG(K2),G(K2),XG(K2+1),G(K2+1))) GO TO 7 C C IF Y IS HIDDEN BETWEEN Z1 AND Z2, UPDATE THE MAXIMUM C FUNCTION. C FOR GENERALITY, THE MAXIMUM FUNCTION IS UPDATED EVEN IF C THIS IS THE (NFNS)TH CURVE. IF(JJ+IGG-INDEXG.GE.MAXDIM) GO TO 700 IF(INDEXG.EQ.IGG) GO TO 712 J1 = INDEXG+1 DO 12 I = J1,IGG JJ = JJ+1 XH(JJ) = XG(I) 12 H(JJ) = G(I) 712 JJ = JJ+1 XH(JJ) = Z2 H(JJ) = F(Z2,XG(IGG),G(IGG),XG(IGG+1),G(IGG+1)) INDEXG = IGG INDEXT = ITT GO TO 60 C C IF T IS NOT HIDDEN BETWEEN Z1 AND Z2, UPDATE THE MAXIMUM C FUNCTION AND PLOT. 7 NGRAPH = ITT-INDEXT+2 IF(JJ+NGRAPH-1.GT.MAXDIM) GO TO 700 N2 = JJ IF(NGRAPH.EQ.2) GO TO 9 J1 = INDEXT+1 DO 11 I = J1,ITT JJ = JJ+1 XH(JJ) = X(I) 11 H(JJ) = Y(I) 9 JJ = JJ+1 XH(JJ) = Z2 H(JJ) = F(Z2,X(ITT),Y(ITT),X(ITT+1),Y(ITT+1)) C C CALL SYSTEMS ROUTINE TO PRODUCE LINE PLOT OF C (XH(I),H(I),I=N2,N2+NGRAPH-1). C ********************************************************** IF(IFPLOT.EQ.1) CALL PDATA(XH(N2),H(N2),NGRAPH,0,1, 1 XSTART,DELTAX,SIGN*YMIN, 2 SIGN*DELTAY,.07) C INDEXT = ITT INDEXG = IGG 60 IF(LAST.EQ.1) GO TO 61 X1 = X2 F1 = F2 Z1 = Z2 C C AFTER PLOTTING AND/OR UPDATING THE MAXIMUM FUNCTION ON THE C INTERVAL (Z1,Z2), SEARCH FOR THE NEXT ZERO IF THE END OF C THE ABCISSA TABLE XT HAS NOT BEEN REACHED. IF(IT.LE.N1) GO TO 1100 GO TO 1008 C C AFTER Y VS. X HAS BEEN PLOTTED, FINISH UPDATING AND STORE C THE NEW MAXIMUM FUNCTION. C ALLOW FOR THE POSSIBILITY THAT THE PREVIOUS MAXIMUM C FUNCTION EXTENDS TO THE RIGHT OF THE FUNCTION JUST C PLOTTED. 61 IF(XG(NG).LE.XG(NG-1)) NG = NG-1 IF(XG(NG).LE.X(N1)) GO TO 33 IF(JJ+3+NG-IGG.GT.MAXDIM) GO TO 700 XH(JJ+1) = XH(JJ)+EPS JJ = JJ+1 H(JJ) = F(X(N1),XG(IGG),G(IGG),XG(IGG+1),G(IGG+1)) IGGP1 = IGG+1 DO 34 J = IGGP1,NG JJ = JJ+1 XH(JJ) = XG(J) 34 H(JJ) = G(J) 33 NG = JJ+2 IF(NG.GT.MAXDIM) GO TO 700 DO 13 I = 1,JJ G(I) = H(I) 13 XG(I) = XH(I) C C THE FOLLOWING PRECAUTIONARY STEP IS USED IN PLACE OF A C TEST IN SUBROUTINE LOOKUP TO SEE IF THE VALUE FOR WHICH WE C WANT AN INDEX IS OUTSIDE THE TABLE. C THE LAST XG VALUE WILL BE SET EQUAL TO THE LAST ABCISSA C OF THE NEXT CURVE TO BE PLOTTED. XG(JJ+1) = XG(JJ)+EPS G(JJ+1) = YMIN+DYKK IF(SIGN.LT.0.) G(JJ+1) = -YMIN-50.*DELTAY+DYKK G(NG) = G(JJ+1) C C RESTORE ARRAYS X AND Y BEFORE RETURNING. 66 IF(NFNS.LT.0) GO TO 53 DO 82 I = 1,N1 X(I) = X(I)+DXKK 82 Y(I) = SIGN*Y(I)-DYKK 53 XG(NG) = SIGN RETURN C C IF STATEMENT 700 IS REACHED, DIMENSIONS WOULD HAVE BEEN C EXCEEDED. SEE COMMENTS ON CALLING SEQUENCE FOR HIDE. 700 MAXDIM = -MAXDIM GO TO 66 END SUBROUTINE LOOKUP(X,XTBL,J) LOOK4870 C C THIS SUBROUTINE IS CALLED BY HIDE TO PERFORM A TABLE C LOOKUP. BECAUSE OF PRECAUTIONS TAKEN IN HIDE, A TEST TO C SEE IF X IS OUTSIDE THE TABLE IS UNNECESSARY. C DIMENSION XTBL(1) J = 2 4 IF(XTBL(J)-X) 1,2,3 1 J = J+1 GO TO 4 2 RETURN 3 J = J-1 RETURN END