C #LPLTA V2B 19-OCT-72. C LAST UPDATE: 30-MAY-73. C SUBROUTINE LPLTA(Y,N,ZMIN,ZMAX,NROW,NCOL, LOG) DIMENSION Y(N) C C *PURPOSE. C TO OUTPUT A PICTURE (GRAPH) OF A REAL ARRAY ON A LINEPRINTER C OR SIMILAR LISTING DEVICE. C C *PARAMETERS: C Y - THE REAL ARRAY OF DIMENSION "N" OR MORE TO BE OUTPUT. C THIS ARRAY IS NOT CHANGED. C N - THE INTEGER LOGICAL LENGTH OF THE ARRAY "Y". C ZMIN- THE REAL LOWER LIMIT OF THE Y-AXIS OF THE PLOT OUTPUT. C THE Y AXIS IS DOWN THE PAGE. C ZMAX- THE REAL UPPER LIMIT OF THE Y-AXIS OF THE PLOT OUTPUT. C NROW- THE INTEGER NUMBER OF ROWS ( LINES ) IN THE PICTURE. C NCOL- THE INTEGER NUMBER OF COLUMNS PER ROW (LINE) IN THE PICTURE. C LOG - THE INTEGER VALUE OF THE FORTRAN I/O CHANNEL FOR THE C LISTING OUTPUT. C C INPUT PARAMETERS: C Y, N, ZMIN, ZMAX, NROW, NCOL, LOG C OUTPUT PARAMETERS: C C C *METHOD. C "LPLTA" STARTS BY OUTPUTTING A HEADING GIVING THE NUMBER C "N" OF POINTS, THE Y-AXIS RANGE AND THE NUMBER OF ROWS C AND COLUMNS. C FOR EACH OF THE "NCOL" COLUMN POSITIONS A "Y" VALUE IS C INTERPOLATED FROM THE TWO NEAREST Y(I) VALUES IN THE ARRAY. C THESE INTERPOLATED Y VALUES ARE TURNED INTO ROW NUMBERS IN THE C RANGE 1 TO "NROW". THE LEFT HAND EDGE OF THE PICTURE IS MARKED C WITH "I" CHARACTERS, THE Y=ZERO AXIS IS MARKED WITH "-" CHARS IF C IT IS IN THE RANGE OF THE PLOT. DATA POINTS ARE MARKED WITH C "X" CHARACTERS AND "+" MESH POINTS ARE PLACED EVERY 10 ROWS C AND COLUMNS. C IF "NROW" >20 A NEW PAGE IS THROWN BEFORE ANY OUTPUT. C C THIS ROUTINE IS DESIGNED TO BE AS PORTABLE AS POSSIBLE. C C *ACCURACY. C C *RESTRICTIONS. C THE NUMBER OF COLUMNS "NCOL" MUST BE <= 101. C THE NUMBER OF ROWS "NROW" MUST BE <= 51. C C *ERROR CONDITIONS. C IF THE BOUNDS DO NOT MAKE SENSE A SELF EXPLANATORY MESSAGE C IS PRINTED OUT ON THE I/O CHANNEL "LOG". C C *NON STANDARD ROUTINES CALLED. C C *TYPICAL TIMES. C C *ORIGIN. M.R.MANNING. C C *COMMENTS. C THIS ROUTINE HAS AN INTERNAL WORKING SPACE EQUAL TO TWICE C THE MAXIMUM NUMBER OF COLUMNS. C C #END. C C #START. DIMENSION IWRK(101), LBUF(101) C THE VALUE 101 ABOVE IS MAX VALUE OF NCOL DATA KXXS, KYXS, KMPT, KDPT/ 1H-, 1HI, 1H+, 1HX/ C THAT SETS POINTS FOR X,Y AXES AND MESH AND DATA POINTS. DATA KSPC, IZR/ 1H , 0/ C C START HERE. C IF(NCOL.GT.101) NCOL=101 IF(NROW.GT.51) NROW=51 C CHECK BOUNDS. IF (ZMAX .EQ. ZMIN) GO TO 500 C C IF NROW > 20 THROW NEW PAGE. 100 IPG= 0 IF (NROW .GT. 20) IPG= 1 C C NOW HEAD UP A PAGE TO START. C WRITE(LOG,900) IPG, N,ZMIN,ZMAX,NCOL,NROW 900 FORMAT(I1,'LPLTA: PICTURE OF',I4,' POINTS. VERTICAL RANGE ', 1 G14.6,' TO ',G14.6,' MESH IS',I5,' BY ',I5/) C C SORT OUT WHAT IS TO BE PLOTTED. C DEL=FLOAT(N-1)/FLOAT(NCOL-1) DZ=FLOAT(NROW-1)/(ZMAX-ZMIN) DO 150 I=1,NCOL C GET THE LINE NUMBER FOR THE NEXT Y POINT ON THE PICTURE. X=1.+FLOAT(I-1)*DEL IX=X DX=X-FLOAT(IX) YCALC=Y(IX+1)*DX+Y(IX)*(1.-DX) ILN=(YCALC-ZMIN)*DZ + 0.5 ILN=NROW-ILN IF(ILN.GT.NROW) ILN=NROW IF(ILN.LT.1) ILN=1 150 IWRK(I)=ILN C ALSO REMEMBER THE LINE NUMBER Y=0 IS AT. ILN=-ZMIN*DZ IY0=NROW-ILN C C NOW WE CAN OUTPUT THE PICTURE. C DO 250 J=1,NROW C PRINT NEXT LINE DO 205 I=1,NCOL 205 LBUF(I)=KSPC LDIF=J-IY0 LBUF(1)=KYXS NNSP=1 IF(LDIF.NE.0) GO TO 212 C PUT IN THE HORIZONTAL AXIS DO 210 I=1,NCOL 210 LBUF(I)=KXXS 212 IF(MOD(LDIF,10)) 220,214,220 214 DO 215 I=1,NCOL,10 215 LBUF(I)=KMPT NNSP=NCOL 220 DO 240 I=1,NCOL IF(J.NE.IWRK(I)) GO TO 240 LBUF(I)=KDPT IF(I.GT.NNSP) NNSP=I 240 CONTINUE C WRITE IT! WRITE(LOG,901) (LBUF(I),I=1,NNSP) 901 FORMAT(10X,101A1) 250 CONTINUE C RETURN C PARAMETER ERROR 500 WRITE(LOG, 902) ZMIN, ZMAX 902 FORMAT(' LPLTA: VERTICAL SCALE ',G14.6,' TO ',G14.6,' NO GOOD'/) RETURN END