home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
100-199
/
ff144.lzh
/
AnalytiCalc
/
AnalyUtilSrc.Arc
/
ACGraf.For
next >
Wrap
Text File
|
1987-10-15
|
40KB
|
1,346 lines
C COPYRIGHT (C) 1983 GLENN EVERHART
c all rights reserved
C G H A S P - Generalized Histogram And Scatter Plot
C REQUIREMENTS:
C COMMONS /EXTRA/ AND /PLOTS/ MUST EXIST, AND ARRAY MA'S DIMENSION (AS 4
C BYTE INTEGERS) MUST BE PLACED INTO NDLTY.
C NPLTS IS THE NUMBER OF PLOTS TO BE GENERATED; THEY ARE ALLOCATED OUT OF
C ARRAY MA DYNAMICALLY.
C THE VARIABLES IN THE /PLOTS/ COMMON HAVE THE FOLLOWING MEANINGS:
C NDIM IS THE NUMBER OF DIMENSIONS. 1 IS HISTOGRAM, 2 IS SCATTER PLOT
C XMIN,YMIN ARE X,Y MIN COORDS IN THE HISTOGRAM
C DX,DY ARE BIN SIZES
C NBINX,NBINY ARE NUMBER OF BINS IN X AND Y (NOTE GHASP WILL INDICATE NUMBER
C OF OVERFLOWS)
C TITLE IS AN ARRAY OF CHARACTERS USED TO PRINT OUT THE TITLE FOR THE PLOT.
C THE SUBROUTINE INTERFACE IS TO CALL THE SUBROUTINE PLOT.
C
C CALL:
C CALL PLOT(XVAL,YVAL,IFUNCT,NPLT)
C WHERE XVAL AND YVAL ARE X,Y COORDINATES FOR THE PLOT IF SCATTERPLOT, OR
C X IS THE COORDINATE AND Y THE WEIGHT IF A HISTOGRAM.
C IFUNCT IS -1, 0, 1, OR 2.
C -1 MEANS INITIALIZE; CALL PLOT ONCE THIS WAY TO SET UP THE NUMBER
C OF HISTOGRAMS AND INITIALIZE ITS SCRATCH VARIABLES.
C 0 MEANS INITIALIZE VARIABLES FOR A GIVEN PLOT NUMBER. THIS EXPECTS
C YOU HAVE SET THE PLOTS COMMON VARIABLES UP BEFORE THE
C CALL. SET XVAL TO 4H/ DIM/ AT THIS CALL TO PRINT SOME
C INFORMATION ABOUT HOW MUCH OF THE PLOT ARRAY IS USED UP;
C THIS WILL ALLOW YOU TO CHANGE THE SIZE OF MA TO WHAT
C IS REALLY NEEDED.
C 1 MEANS ENTER A POINT IN THE HISTOGRAM/SCATTER PLOT, USING THE X AND
C Y VALUES. NOTICE THAT THE COMMON /PLOTS/ VARIABLES ARE NOT
C NECESSARILY THE SAME AS AT IFUNCT=0 TIME; ONCE THE PLOT IS
C INITIALIZED YOU JUST ADD POINTS AND PLOT.
C 2 MEANS PLOT THE HISTOGRAM OR SCATTER PLOT. THE XVAL ARGUMENT IS
C IMPORTANT AT THIS TIME; PLOT NUMBER MUST BE GIVEN.
C
C A VARIETY OF OPTIONS FOR PLOT FORMAT EXIST AND ARE ENCODED BY THE LETTER
C USED IN THE XVAL ARGUMENT OF PLOT AT THE TIME YOU CALL IT WITH THE IFUNCT
C ARGUMENT OF 2. TWO OF THESE ARE THAT THE PLOT CAN BE MADE AS HIGH AS IT
C NEEDS TO BE TO PLOT THE DATA. THIS IS THE VARY COMMAND AND IS ENCODED AS
C 4H/ V/ (SEE EXAMPLE CALLER PROGRAM). ANOTHER OPTION IS THE HACK OPTION,
C CUTTING OFF THE PLOT AT ONE PAGE. THIS USES THE VALUE 4H/ H/. ONE CAN
C ALSO SCALE THE PLOT TO FIT ON A PAGE; 4H/ S/ WILL DO
C THIS. THERE ARE SOME DENSITY PLOTS AVAILABLE ALSO FOR SCATTER PLOTS;
C THE NORMAL PLOTS ARE 2 DIGIT NUMBERS (6 BITS ARE USED, PACKED 5 BINS TO
C A WORD, FOR COUNTING NUMBERS PER BIN).
C USE 4H/ Q/ FOR SHADED SCATTER PLOTS; DENSITY WILL BE APPROXIMATE ONLY
C BUT GHASP WILL ATTEMPT TO PLOT A SCATTER PLOT SHADED. NOTE A PLOT CAN
C BE PRINTED OUT MORE THAN ONCE, IN DIFFERENT FORMATS, SO A PLOT MAY BE
C PLOTTED NUMERICALLY WITH 4H/ V/ AND IN SHADED MODE AS WELL.
C
C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
C ALL RIGHTS RESERVED
C PCC GRAF
C NOTE: REQUIRES LUN 4 FOR TERMINAL OUTPUT AND LUN 5 FOR
C TERMINAL INPUT.
C (GHASP USES 6 FOR LP:)
C
C GRAPHICS INTERFACE AND OUTPUT FROM PCC SPREADSHEET
C
C GLENN EVERHART, 23-JAN-83
C
C SYNTAX AND USAGE:
C
C This program is designed to allow an interactive user to enter
C a single command line to the program which it will parse (using
C the special version of VARSCN in GVARSCN) and allow graphic output
C from PortaCalc saved spread sheets. The assumption made is that
C the sheet has been saved with the PPN or PDN command. The filename
C must appear in the command line and variables in the file (named as
C though the cursor had been in cell A1 when the PPN / PDN was done)
C may be histogrammed or scatterplotted against each other.
C
C The GHASP routine (a FORTRAN plot package for ordinary printers)
C will be used for this version.
C
C Input syntax:
C NN or LL filename.ext V1:V2 c V3:V4 +switches
C
C where
C
C an L in columns 1 or 2 takes log of 1st or 2nd range numbers (base 10),
C
C filename appears at the start of the command line after a space
C and with a space following it and is a valid RSX or VMS file spec.
C
C V1:V2 and V3:V4 are ranges. V3:V4 is optional and its presence implies
C a scatter plot. These ranges must be either a row or a column or part
C of them. If only range V1:V2 is present, a histogram will be done using
C the Scale option of GHASP to fit the plot onto a page. The plot will be
C set up for 100 bins horizontal, 50 vertical.
C If the V3:V4 range exists, the character Q in the c position (the
C are required) will result in a "density" plot in which the program will
C attempt to print darker in filled bins. This is crude and the default is
C to use a 2 digit number. Again, plot size will be scaled to 50 by 50
C bins.
C
CHARACTER*1 LINE(128),KLET,LLET
INTEGER*4 NDLTY,NPLTS,MA(1000)
INTEGER*4 NDIM,TITLE(19)
CHARACTER*1 LTITL(76)
CHARACTER*1 LLA,LLB
EQUIVALENCE(TITLE(1),LTITL(1))
INTEGER*4 IXTR
COMMON/IXTR/IXTR
INTEGER*4 NBINX,NBINY
REAL*4 XMIN,YMIN,DX,DY
INTEGER*4 KK,LS1,LS2,LQ
REAL*4 VEC1(300),VEC2(300)
CHARACTER*1 IONM(50)
COMMON/EXTRA/NDLTY,NPLTS,MA
EXTERNAL INDX
COMMON/PLOTS/NDIM,XMIN,YMIN,DX,DY,NBINX,NBINY,TITLE
REAL*4 RS,RV,RQ,RH
CHARACTER*4 RRS,RRV,RRQ,RRH
EQUIVALENCE(RS,RRS),(RV,RRV),(RQ,RRQ),(RH,RRH)
DATA RRS/' S'/
DATA RRV/' V'/
DATA RRQ/' Q'/
DATA RRH/' H'/
100 NDLTY=1000
NPLTS=1
C CALL ASSIGN(4,'TI:')
C CALL ASSIGN(5,'TI:')
C CALL ASSIGN(6,'LP:')
IXTR=0
DO 1982 N=1,128
1982 LINE(N)=0
WRITE(*,8000)
8000 FORMAT(' Give Output Dataset Name>',\)
read(*,2)ionm
DO 8222 N=1,50
NNN=51-N
IF(ICHAR(IONM(NNN)).GT.32)GOTO 8223
IONM(NNN)=0
8222 CONTINUE
8223 CONTINUE
C IDL=NNN+1
CALL WASSIG(6,IONM)
ITTFG=0
IF((IONM(1).EQ.'C'.OR.IONM(1).EQ.'c').AND.IONM(4).EQ.':')
1 ITTFG=1
C ALSO MAKE TTY IMAGES IF 1ST 2 CHARS ARE TT
IF(IONM(1).EQ.'T'.AND.IONM(2).EQ.'T')ITTFG=1
IF(ITTFG.EQ.1)IXTR=1
C TOGGLE FOR PLOT ROUTINE...
WRITE(*,1)
1 FORMAT(' Enter plot command>',\)
READ(*,2)LINE
2 FORMAT(128A1)
C FIND END OF LINE ENTERED BY LOOKING FOR 1ST CHAR BIGGER THAN SPACE IN ASCII.
DO 1980 N=1,128
NN=129-N
IF(ICHAR(LINE(NN)).GT.32)GOTO 1981
1980 CONTINUE
1981 LQ=NN+1
LOGF1=0
LOGF2=0
NBFG1=0
IF(LINE(1).EQ.'P')NBFG1=1
C NBFG1 MAKES YMIN=0. THUS IF CMD STARTS WITH PP PLOT IS POSITIVE
C DITTO NBFG2
NBFG2=0
IF(LINE(2).EQ.'P')NBFG2=1
IF(LINE(1).EQ.'L')LOGF1=1
IF(LINE(2).EQ.'L')LOGF2=1
LLA=LINE(1)
LLB=LINE(2)
C 1ST 2 CHARS SAY LOG OR LOGLOG (IF 2DIM GRAPH)
C LOGF1 WILL TAKE LOG OF VEC1 AND LOGF2 WILL TAKE LOG OF VEC2
C IF SET.
C NOTE THAT THIS ALSO TAKES ABS OF NUMBER.
LQ=LQ+1
LQ=MIN0(128,LQ)
LINE(127)=0
LINE(128)=0
LINE(LQ)=0
c
c process switches.
c switches are after trailing + sign
c
c +hnnn = set height
c +wnnn = set width
nhov=0
nwov=0
KK=INDX(LINE,'+')
IF(KK.GT.50)GOTO 6000
C SKIP THIS AREA IF NO SWITCHES ARE FLAGGED
LINE(KK)=CHAR(0)
C SKIP SWITCHES IN LATER PROCESSING.
c since we look for a number, first try to decode the number as a
c 3 digit one...
kkk=kk+2
lend1=kkk+30
call gn(kkk,lend1,num1,line)
c num1 can be h or w depending on line(kk+1)
if(line(kk+1).eq.'h'.or.line(kk+1).eq.'H')nhov=num1
if(line(kk+1).eq.'w'.or.line(kk+1).eq.'W')nwov=num1
C GN RETURNS ITS LAST CHAR AFTER THE # IN ITS 1ST ARG.
IKK=INDX(LINE(KK+1),'+')
IF(IKK.GT.30)GOTO 6000
KKK=IKK+KK
c 2nd + sign flags 2nd switch...
kk=kkk+2
lend1=kk+30
call gn(kk,lend1,num1,line)
if(line(kkk+1).eq.'h'.or.line(kkk+1).eq.'H')nhov=num1
if(line(kkk+1).eq.'w'.or.line(kkk+1).eq.'W')nwov=num1
c that should do it...
6000 CONTINUE
LS1=INDX(LINE,CHAR(32))
C CALL OUR PORTACALC INDEX FCN
KK=LS1+1
LS2=INDX(LINE(KK),CHAR(32))
IF(LS1.GT.40.OR.LS2.GT.40)WRITE(*,25)LS1,LS2,LQ
25 FORMAT(' Spaces not seen. Find spaces at ',3I6,
1 /,' Usage: ACG file V1:V2 C V3:V4 +HNNN+WNNN')
IF (LS1.GT.40.OR.LS2.GT.40)GOTO 100
LINE(LS2+LS1)=0
CALL RASSIG(1,LINE(LS1+1))
C SET UP FILE 1 TO READ SAVED FILE FROM SHEET
LINE(LS2+LS1)=32
LX=LS1+LS2+1
C SCAN THE REST STARTING AT LX
C GRAB OFF OUR ARGUMENTS FIRST, THEN GET ON WITH THE PLOTS.
CALL PLOT(0.,0.,-1,0)
C HOWEVER INITIALIZE PLOT ARRAY EARLY ON.
K1=LX
K2=110
CALL GVSCAN(LINE,K1,K2,LSTCHR,ID1,ID2,IVLD)
IF (IVLD.NE.0)GOTO 150
WRITE(*,3)
3 FORMAT(' First variable invalid. Try again.')
GOTO 100
150 CONTINUE
IF(LINE(LSTCHR).EQ.':')GOTO 160
WRITE(*,4)
4 FORMAT(' Colon missing in first range.')
GOTO 100
160 CONTINUE
K1=LSTCHR+1
K2=110
CALL GVSCAN(LINE,K1,K2,LSTCR,ID1B,ID2B,IVLD)
IF (IVLD.NE.0)GOTO 164
WRITE(*,5)
5 FORMAT(' 2nd variable in 1st range invalid.')
GOTO 100
164 CONTINUE
IF(ID1.NE.ID1B.AND.ID2.NE.ID2B)GOTO 166
GOTO 167
166 WRITE(*,6)
6 FORMAT(' Variable pair not in a row or column together')
GOTO 100
167 CONTINUE
KCR=1
C : CHECK FOR '' OLD VERSION..........
IF(LINE(LSTCR).EQ.'[')GOTO 170
LSTCR=LSTCR+1
IF(LINE(LSTCR).EQ.'[')GOTO 170
169 WRITE(*,7)KCR
7 FORMAT(' Invalid format of [c] character ',I5)
GOTO 100
170 LSTCR=LSTCR+1
KCR=2
IF(LINE(LSTCR).EQ.']')GOTO 169
KLET=LINE(LSTCR)
LSTCR=LSTCR+1
C SCAN OVER NEXT ']' NOW
KCR=3
IF(LINE(LSTCR).NE.']')GOTO 169
LSTCR=LSTCR+1
C IF WE PICK UP A VALID VARIABLE HERE, ALL'S WELL. OTHERWISE WE HAVE
C A HISTOGRAM AND WE'RE DONE (FOR THIS VERSION ANYHOW)
K1=LSTCR
K2=110
NDIM=1
CALL GVSCAN(LINE,K1,K2,LSTT,ID1C,ID2C,IVLD)
IF(IVLD.EQ.0)GOTO 200
C IF HERE, THERE HAS TO BE 1 MORE VARIABLE DECODED AND TESTED.
IF(LINE(LSTT).EQ.':')GOTO 175
WRITE(*,8)
8 FORMAT(' Invalid second variable range.')
GOTO 100
175 CONTINUE
K1=LSTT+1
K2=110
CALL GVSCAN(LINE,K1,K2,LSTCC,ID1D,ID2D,IVLD)
IF(IVLD.NE.0)GOTO 180
WRITE(*,9)
9 FORMAT(' Invalid 2nd variable of 2nd range')
GOTO 100
180 CONTINUE
C NOW ALL DECODED.
NDIM=2
C NOW WE HAVE SET UP THE DIMENSION OF OUR PLOT.
200 CONTINUE
C NOW IT'S POSSIBLE TO READ IN THE FILE ONCE TO NORMALIZE IT, THEN
C REWIND AND READ AGAIN TO PLOT IT.
XMIN=99.E10
YMIN=99.E10
IF(NBFG1.NE.0)YMIN=0.
IF(NBFG2.NE.0)XMIN=0.
C SET TERRIBLY LARGE X,Y MINS UNLESS POSITIVE PLOT, THEN START AT 0.
C (WE'LL FIX THEM UP!)
XMAX=-99.E10
YMAX=-99.E10
C SET UP MAXIMA ALSO IN BOGUS WAY. THIS ENSURES WHATEVER WE GET
C WILL BE BETTER THAN OUR "FIRST GUESS".
C INSERT TITLE AS OUR COMMAND LINE, FOR INTERNAL DOCUMENTATION.
C (LX THRU END)
DO 11 N=1,78
11 LTITL(N)=CHAR(32)
LX=LS1
C INCLUDE FILENAME TOO.
DO 12 N=1,50
LTITL(N)=LINE(LX)
IF(LX.GT.76)GOTO 13
12 LX=LX+1
C FLAG LOG SCALE FLAGS IN TITLE
IF (LLA.EQ.'L')TITLE(18)='LOGX'
IF (LLB.EQ.'L')TITLE(19)='LOGY'
13 READ(1,10)LINE
10 FORMAT(128A1)
IF(NDIM.EQ.2)GOTO 17
XMIN=0.
XMIN2=0.
ICNT=0
17 CONTINUE
C IGNORE TITLE, JUST READ IT IN, THEN FORGET IT.
IV1=1
IV2=1
220 CONTINUE
C NOTE WE READ IN THE NUMBER IN NUMERIC FORMAT. EASIER THAT WAY.
irrw=0
iccl=0
READ(1,14,END=250,ERR=224)LET1,IRRW,ICCL,XYVAL
224 continue
14 FORMAT(A1,I5,1X,I5,1X,E50.35)
READ(1,15,END=250,ERR=225)LFVLD,(LINE(IV),IV=120,128),KKTYP
225 continue
15 FORMAT(I3,1X,9A1,1X,I5)
C READS IN AN ENTRY OF SAVED SHEET. TEST IF IN OUR RANGE.
IF(IRRW.GE.ID1.AND.IRRW.LE.ID1B.AND.ICCL.GE.ID2.AND.ICCL
1 .LE.ID2B)GOTO 221
IF(NDIM.NE.2)GOTO 223
IF(IRRW.GE.ID1C.AND.IRRW.LE.ID1D.AND.ICCL.GE.ID2C
1 .AND.ICCL.LE.ID2D)GOTO 222
GOTO 223
221 CONTINUE
C NUMBER IS IN FIRST RANGE TO PLOT. FIGURE IT OUT.
IF(LOGF1.NE.0.AND.XYVAL.NE.0)XYVAL=ALOG10(ABS(XYVAL))
VEC1(IV1)=XYVAL
IV1=IV1+1
IF(NDIM.EQ.1)ICNT=ICNT+1
IF(NDIM.EQ.1)XMAX=ICNT
IF(NDIM.EQ.1)GOTO 18
IF(XYVAL.LT.XMIN)XMIN=XYVAL
IF(XYVAL.GT.XMAX)XMAX=XYVAL
GOTO 223
18 CONTINUE
IF(XYVAL.LT.YMIN)YMIN=XYVAL
IF(XYVAL.GT.YMAX)YMAX=XYVAL
VEC2(IV2)=FLOAT(ICNT)
IV2=IV2+1
GOTO 223
222 CONTINUE
IF(NDIM.EQ.1)GOTO 223
IF(LOGF2.NE.0.AND.XYVAL.NE.0)XYVAL=ALOG10(ABS(XYVAL))
C NUMBER IS IN SECOND RANGE SELECTED.
C KNOW IT'S A Y COORD HERE.
VEC2(IV2)=XYVAL
IV2=IV2+1
IF(XYVAL.LT.YMIN)YMIN=XYVAL
IF(XYVAL.GT.YMAX)YMAX=XYVAL
223 CONTINUE
GOTO 220
250 CONTINUE
C NOW MINIMA,MAXIMA ALL SET UP.
IF(XMIN.GE.XMAX.OR.YMIN.GE.YMAX)STOP
C EXIT IF NOTHING IS THERE TO GRAPH.
XRANGE=XMAX-XMIN
YRANGE=YMAX-YMIN
C
IF(XRANGE.LE.0)XRANGE=60.
IF(YRANGE.LE.0)YRANGE=20.
C XNUM=100.
AMXRG=100.
AMYRG=50.
IF(ITTFG.EQ.1)AMXRG=60.
IF(ITTFG.EQ.1)AMYRG=20.
XNUM=AMXRG
IF(NDIM.EQ.1.AND.(XRANGE.LT.100.))XNUM=XRANGE
YNUM=AMYRG
IF(NDIM.EQ.2)XNUM=AMYRG
C HANDLE SWITCHES THAT OVERRIDE HEIGHT AND WIDTH TO USE.
IF(NHOV.NE.0)YNUM=NHOV
IF(NWOV.NE.0)XNUM=NWOV
DX=XRANGE/XNUM
DY=YRANGE/YNUM
IF(.NOT.(NDIM.EQ.1.AND.DX.LT.1))GOTO 19
IF(NWOV.EQ.0)DX=1.
19 NBINX=XNUM
NBINY=YNUM
CALL PLOT(RV,0.,0,1)
C INITIALIZE PLOT
C NDIM, MINIMA, MAXIMA ALL SET UP NOW.
C
C WE SAVED VALUES IN VEC1,VEC2 AND PLOT THAT WAY.
C ALSO NOTE BOTH ALWAYS EXIST.
C
LENGTH=MIN0(IV1,IV2)
C SAME IF NDIM=1
DO 20 N=1,LENGTH
IF(NDIM.EQ.1)CALL PLOT(VEC2(N),VEC1(N),1,1)
IF(NDIM.NE.1)CALL PLOT(VEC1(N),VEC2(N),1,1)
20 CONTINUE
C PLOT IT OUT NOW
C CHOOSE OPTION FOR FORMAT (SCALE, VARY HEIGHT, SHADE)
X=RS
IF(KLET.EQ.'V')X=RV
IF(KLET.EQ.'Q')X=RQ
IF(KLET.EQ.'H')X=RH
CALL PLOT(X,0,2,1)
STOP
END
SUBROUTINE GN(LAST,LEND,NUM,LINE)
IMPLICIT INTEGER*4(A-Z)
C PARAMETER 1=1,14=14
DIMENSION LINE(110)
CHARACTER*1 LINE
EXTERNAL INDX
CHARACTER*1 NCH
INTEGER*4 CH,SFG
NUM=0
JSSF=0
ISSF=0
CH=0
SFG=1
NCH=0
DO 1 N=LAST,LEND
M=N
NCH=LINE(N)
CH=ICHAR(NCH)
IF(CH.EQ.0)GOTO 2
IF(CH.EQ.45)SFG=-1
C SFG=SIGN FLAG
C 43 IS ASCII FOR +; 45 IS ASCII FOR - SIGN.
C IGNORE + SIGNS
IF(CH.GT.32)ISSF=ISSF+1
IF(ISSF.EQ.0.AND.CH.EQ.32)GOTO 1
C IGNORE SPACES TOO, PROVIDED THEY ARE LEADING SPACES.
C (OTHERS MAY BE DELIMITERS.)
IF(CH.EQ.43.OR.CH.EQ.45)JSSF=JSSF+1
IF(JSSF.GT.1.AND.(CH.EQ.43.OR.CH.EQ.45))GOTO 2
C IF WE HAVEN'T SEEN A +/- PROCESS IT HERE.
IF(CH.EQ.43)GOTO 1
IF(CH.EQ.45)GOTO 1
IF(CH.LT.48.OR.CH.GT.57)GOTO 2
C TERMINATE ON ANY NON NUMERIC. SHOULD ALLOW TERMINATE ON SECOND #.
IF(NUM.LT.3100)NUM=10*NUM+(CH-48)
1 CONTINUE
C NEXT LINE WAS MAX0...
2 LAST=MIN0(M,LEND)
NUM=NUM*SFG
C ACCOUNTED FOR SIGN; NOW RETURN
RETURN
END
SUBROUTINE GVSCAN(LINE,IBGN,LEND,LSTCHR,ID1,ID2,IVALID)
C COPYRIGHT (C) 1983 GLENN EVERHART
C ALL RIGHTS RESERVED
C VARSCN - SCAN COMMAND LINE FOR VARIABLE NAMES.
C DUMMY GRAPHICS VERSION
C (NO FUNNY ADDRESS MODES ETC.; FOR USE ON SAVED SHEETS.)
C
C SCANS FOR VARIABLE NAMES OF FORM AAANNN WHERE AAA = LETTERS
C BETWEEN A AND Z UP TO NON-ALPHA, CORRESPONDING TO ROW, FOLLOWED BY
C NUMBERS IN THE 0-9 RANGE MAKING A DECIMAL COLUMN NUMBER.
C THIS VERSION IS FOR USE WITH A GRAPHICS PROGRAM AND WILL NOT DECODE
C FORMS OF TYPE P## OR D## AS WILL THE ONE IN PORTACALC. ALSO IT WILL
C NOT MAKE CHECKS ON LIMITS OF VARIABLES SAVE FOR VERY CRUDE CHECKS OF
C REASONABLENESS.
C
C THE LETTERS ARE FORMED BY
C A-Z ALONE GIVE ROW 1-26, COL 1. % IS ROW 27,COL1
C A1-Z1 GIVE ROW 1-26, COL 2
C AA1-ZZ1 ARE ROW 27-52, COL 2
IMPLICIT INTEGER*4 (A-Z)
INTEGER*4 RRW,RCL,CUP,NEL,RRCL
C PARAMETER RRW=1000
C PARAMETER RCL=1000
C RRCL IS USED AS A GUARD TO ENSURE AGAINST OVERFLOWS. VAX COMPLAINS OF
C INTEGER OVERFLOWS (PAIN).
C PARAMETER RRCL=1100
C PARAMETER CUP=1,NEL=14
C NOTE COL 1 IS DUMMY. DISPLAY THE SHEET SIDEWAYS SO WE GET USUAL VISUAL
C ROWS, COLS., AND ACCUMULATORS A-Z,% JUST APPEAR AS A FICTITIOUS ROW 0
C ON DISPLAY, INSTEAD OF REAL COLUMN 1 HERE.
DIMENSION LINE(LEND)
CHARACTER*1 LINE
C
INTEGER*4 RSM,CSM,AFG,ASM,VCF,CH
DATA RRW/1000/,RCL/1000/,RRCL/1200/,CUP/1/,NEL/14/
C ZERO OUR VARIABLES
LPFG=0
C ! FLAG WE GOT A LOGICAL/PHYSICAL # FORM AND TYPE
AFG=0
C ! FLAG WE SAW AN ALPHA
ASM=0
C ! SUM OF ALPHAS HASHCODED (ACCUMULATOR)
NSM=0
C ! ACCUMULATOR FOR NUMERICS
NFG=0
C ! FLAG WE SAW A NUMERIC
RSM=0
C ! AC FOR ROWS IN # FORMS
CSM=0
C ! AC FOR COLS IN # FORMS
ISPC=0
C ! COUNTER FOR NONSPACES SEEN (USED TO STOP ON TRAILING SPACES)
IF(LINE(IBGN).NE.'%')GOTO 2000
ID1=27
ID2=1
IVALID=1
LSTCHR=IBGN+1
C SPECIAL CASE FOR % = AC #27
RETURN
2000 CONTINUE
DO 1 N=IBGN,LEND
VCF=0
LSTCHR=N
CH=ICHAR(LINE(N))
C IGNORE SPACES AND TABS IF LEADING
IF(CH.GT.32)ISPC=ISPC+1
IF(CH.GT.0.AND.CH.LE.32.AND.ISPC.EQ.0)GOTO 1
C GET CHARACTER VALUE IN.
C MUST BE UPPERCASE.
IF(.NOT.(CH.GE.65.AND.CH.LE.91)) GOTO 100
C CH IS AN ALPHA, RANGE A-Z
VCF=1
C ! VALID CHAR SEEN
AFG=1
C !SAW THE ALPHA
IF(ASM.LT.RRCL)ASM=(CH-64)+26*ASM
IF(CH.EQ.80)LPFG=1
C ! FLAG WE GOT PHYS. FORM MAYBE
IF(CH.EQ.68)LPFG=2
C ! FLAG WE GOT DISPLAY FORM MAYBE
100 CONTINUE
C NEXT TEST NUMERICS
IF(.NOT.(CH.GE.48.AND.CH.LE.57))GOTO 101
C CH IS A NUMERIC, RANGE 0-9
VCF=1
C ! VALID CHAR SEEN
NFG=1
C ! FLAG WE SAW NUMERIC
IF(AFG.EQ.0)GOTO 103
102 CONTINUE
IF(NSM.LT.RRCL)NSM=(CH-48)+10*NSM
C ! CONVERT CHARS TO BINARY AS SEEN
101 CONTINUE
IF(VCF.EQ.0)GOTO 2
C !END ON ANY INVALID CHARACTER
1 CONTINUE
GOTO 2
103 CONTINUE
C INVALID ... NUMERIC AND NO PRIOR ALPHA. FLAG BAD NAME AND EXIT.
IVALID=0
RETURN
2 CONTINUE
IF(AFG.EQ.0)GOTO 103
ID1=ASM
C HERE WE MAKE ID2 JUST NSM, NOT 1+NSM.
ID2=NSM
C FLAG PURE ALPHAS NOT VALID FOR PLOTTING HERE. (THEY AREN'T SAVED ANYHOW)
IF(NSM.LE.0)GOTO 103
IF(ID1.GT.RRW.OR.ID1.LE.0)GOTO 103
IF(ID2.GT.RCL.OR.ID2.LE.0)GOTO 103
IVALID=1
C ALL IS WELL
RETURN
END
SUBROUTINE HIHDIG(X,ID,IS)
XT=X
ID=0
IS=0
IF (ABS(X).EQ.0.0) RETURN
IF (ABS(X).LT.1.) GO TO 20
IF (ABS(X).GE.10.) GO TO 30
ID=X
RETURN
20 XT=XT*10.
IS=IS-1
IF (ABS(XT).LT.1.) GO TO 20
GO TO 40
30 XT=XT/10.
IS=IS+1
IF (ABS(XT).GE.10.) GO TO 30
40 ID=XT
RETURN
END
INTEGER FUNCTION INDX ( STR, C )
C
CHARACTER * 1 C, STR ( 1 )
C
C LIMIT RANGE OF SEARCH TO 256 BYTES. THIS IS ARBITRARY BUT I DOUBT
C ANALYTICALC WILL EVER DEAL IN LONGER STRINGS THAN THIS AND
C SEARCHES ALL OVER THE CREATION ARE TO BE AVOIDED.
DO 20019 I = 1, 256
IF (.NOT.( STR ( I ) .EQ. 0 )) GOTO 20021
C RETURN INDX AS EITHER THE LOCATION OF THE CHARACTER OR OF THE
C END OF THE STRING FOR ANALYTICALC. NOTE THAT THIS DIFFERS
C FROM USUAL RATFOR VERSION.
INDX=I
RETURN
20021 CONTINUE
IF (.NOT.( STR ( I ) .EQ. C )) GOTO 20023
INDX = ( I )
RETURN
20023 CONTINUE
20022 CONTINUE
C
20019 CONTINUE
20020 CONTINUE
END
INTEGER FUNCTION ISGN(IARG)
INTEGER*4 IARG
IF(IARG.EQ.0)ISGN=0
IF(IARG.GT.0)ISGN=1
IF(IARG.LT.0)ISGN=-1
RETURN
END
C THE FOLLOWING ROUTINES ARE NEEDED FOR GHASP AND IMPLEMENTED CORRECTLY
C IN DEC FORTRAN AND SOME OTHERS; NOT NECESSARILY CORRECT IN IBM FORTRAN.
C MODIFIED FOR MICROSOFT FORTRAN (WHICH IS MORE FUSSY ABOUT LOGICAL TYPES)
C GCE 7/84
FUNCTION MAND(IK,JK)
INTEGER*4 MAND,KMAND,IK,JK
INTEGER*4 IA,IB
IA=IK
IB=JK
KMAND=IA.AND.IB
MAND=KMAND
RETURN
END
C THE FOLLOWING ROUTINES ARE NEEDED FOR GHASP AND IMPLEMENTED CORRECTLY
C IN DEC FORTRAN AND SOME OTHERS; NOT NECESSARILY CORRECT IN IBM FORTRAN.
C MODIFIED FOR MICROSOFT FORTRAN (WHICH IS MORE FUSSY ABOUT LOGICAL TYPES)
C GCE 7/84
FUNCTION MOR(IK,JK)
INTEGER*4 MOR,IK,JK
MOR=IK.OR.JK
RETURN
END
SUBROUTINE NORM (TOT, IPLT)
DIMENSION XM(1),INDEXV(8)
COMMON/EXTRA/ NDLTY, NPLTS, MA(1)
EQUIVALENCE(MA(1),XM(1)),(INDEXV(1),NDM),(INDEXV(2),IST),
1 (INDEXV(7),NBX)
IF(1.GT.IPLT.OR.IPLT.GT.NPLTS) RETURN
DO 1 I=1,8
J = (I-1)*NPLTS + IPLT
1 INDEXV(I) = MA(J)
IF ( NDM .NE. 1) RETURN
NE =NBX + 2
WT =0.000000001
DO 2 I=1,NE
J =IST + I
2 WT = XM(J) + WT
ADJ = TOT/WT
DO 3 I=1,NE
J = IST + I
3 XM(J)= ADJ*XM(J)
RETURN
END
SUBROUTINE PLOT(X,Y,IENT,IPLT)
DIMENSION JA1(110),JA2(110),JA3(110),KA1(110),KA2(110)
INTEGER*4 IENT,IPLT
DIMENSION KA3(110), KA4(110)
DIMENSION IPNCH(120)
DIMENSION XM(1), XLABL(2), YLABL(2)
DIMENSION LINE(119),IICH(32),ICH(32),INDEXV(8),AIND(8)
1 , XL(12), IBT(6), IZB(6)
CHARACTER*1 IICH
COMMON/PLOTS/ ND, XMIN,YMIN,
1 DX, DY, NBINX, NBINY, TITLE(19)
COMMON/EXTRA/NDIM, NPLTS, MA(1)
EQUIVALENCE (XLABL(1),TITLE(16)),(YLABL(1),TITLE(18))
EQUIVALENCE(INDEXV(1),AIND(1))
EQUIVALENCE (MA(1),XM(1)),(LINE(1),XL(1)),(INDEXV(1),NDM),
1 (INDEXV(2),IST),(AIND(3),XMN),(AIND(4),YMN),(AIND(5),DEX),
2 (AIND(6),DEY),(INDEXV(7),NBX),(INDEXV(8),NBY)
INTEGER*4 IXTR
COMMON/IXTR/IXTR
C IXTR=1 SWITCHES OFF EXTRA STUFF AT BOTTOM OF PLOT
CHARACTER*4 PPNCH
REAL*4 PNC
EQUIVALENCE(PPNCH,PNC)
REAL*4 BLANK
CHARACTER*4 BBLANK
EQUIVALENCE(BLANK,BBLANK)
INTEGER*4 IXXPPP,IPPPPP,IXXBBB,ICHX,ICHP
CHARACTER*4 XXPPP,PPPPP,XXBBB
CHARACTER*1 CHX,CHP
EQUIVALENCE(IXXPPP,XXPPP),(IXXBBB,XXBBB)
CHARACTER*4 RRDIM,RRV,RRH,RRS
REAL*4 RDIM,RV,RH,RS
EQUIVALENCE(RRDIM,RDIM),(RRV,RV),(RRH,RH),(RS,RRS)
DATA PPNCH/'PNCH'/
DATA IICH/ ' ', '1', '2', '3',
1 '4', '5', '6', '7', '8',
2 '9', 'A', 'B', 'C', 'D',
3 'E', 'F', 'G', 'H', 'I',
4 'J', 'K', 'L', 'M', 'N',
5 'O', 'P', 'Q', 'R', 'S',
6 'T', 'U', '*'/
DATA RRS/' S'/
DATA RRDIM/' DIM'/
DATA RRV/' V'/
DATA RRH/' H'/
C VALUES BELOW ASSUME 32 BIT 2S COMPLEMENT INTEGERS...
DATA IBT/33554432, 1048576, 32768, 1024, 32, 1 /
DATA IZB /-1040187393, -32505857, -1015809, -31745, -993, -32 /
DATA BBLANK/ ' '/, XXPPP/ 'XX++'/,
1 PPPPP/ '++++'/, XXBBB/ 'XX '/,
2 CHX/ 'X'/, CHP/ '+'/,
3 IHK/ 31/, NBT/ 6/,
4 LINWDS/ 110/, NOUT/ 6/
DATA INIT/ 0/
ICHX=ICHAR(CHX)
ICHP=ICHAR(CHP)
DO 6670 IV=1,32
6670 ICH(IV)=ICHAR(IICH(IV))
IF(IENT.EQ. 1) GO TO 15
IF(IENT.EQ.-1) GO TO 1
IF(IENT.EQ. 0) GO TO 4
IF(IENT.EQ. 2) GO TO 19
WRITE(NOUT,57) IENT
GO TO 56
1 INIT=1
DO 2 I=1,NDIM
2 MA(I)=0
ISTART=8*NPLTS*NBT
DO 3 I=1,19
3 TITLE(I) = BLANK
IF(IENT.EQ.-1) GO TO 56
4 IF(INIT.EQ.0) GO TO 1
IF(1.LE.IPLT.AND.IPLT.LE.NPLTS) GO TO 5
WRITE(NOUT,58) IPLT
GO TO 56
5 IF(DX.NE.0.0) GO TO 6
WRITE(NOUT,59) IPLT
GO TO 56
6 IF(NBINX.LE.0) NBINX=100
IF(NBINX.GT.LINWDS) NBINX=LINWDS
NBINX=((NBINX-1)/10)*10+10
IF(ND.EQ.1) GO TO 7
IF(ND.EQ.2) GO TO 11
WRITE(NOUT,60) IPLT
GO TO 56
7 IST=(ISTART-1)/NBT +1
ITEST= IST+ NBINX+ 2
IF(ITEST.LE.NDIM) GO TO 8
MA(IPLT) =0
WRITE(NOUT,61) IPLT
GO TO 56
8 ISTART =ITEST*NBT
IF(NBINY.LE.0) NBINY=100
NBINY=((NBINY-1)/10)*10+10
NDM=1
XMN=XMIN
YMN=YMIN
DEX=DX
DEY=DY
NBX=NBINX
NBY=NBINY
DO 9 I=1,8
J=(I-1)*NPLTS +IPLT
9 MA(J)=INDEXV(I)
J=IST+1
DO 10 I=J,ITEST
10 XM(I)=0.0
IF(X.EQ.RDIM) WRITE(NOUT,75) ITEST,IPLT
GO TO 56
11 IF(DY.NE.0.0) GO TO 12
WRITE(NOUT,59) IPLT
GO TO 56
12 IF(NBINY.LE.0) NBINY=50
NBINY= ((NBINY-1)/10)*10+10
NBTS=(NBINX+2)*(NBINY+2)
IF(ISTART+NBTS.LE.NDIM*NBT) GO TO 13
MA(IPLT)=0
WRITE(NOUT,61) IPLT
GO TO 56
13 IST=ISTART
ISTART=ISTART+NBTS
NDM=ND
XMN=XMIN
YMN=YMIN
DEX=DX
DEY=DY
NBX=NBINX
NBY=NBINY
DO 14 I=1,8
J=(I-1)*NPLTS+IPLT
14 MA(J)=INDEXV(I)
IST=(ISTART-1)/NBT +1
IF(X.EQ.RDIM) WRITE(NOUT,75) IST,IPLT
GO TO 56
15 IF(1.GT.IPLT.OR.IPLT.GT.NPLTS) GO TO 56
DO 16 I=1,8
J=(I-1)*NPLTS+IPLT
16 INDEXV(I)=MA(J)
IF(NDM.EQ.1) GO TO 17
IF(NDM.GE.2) GO TO 18
GO TO 56
17 IX= IFIX((X-XMN)/DEX+2.)
IF(IX.LT.1) IX=1
IF(IX.GT. NBX+2) IX=NBX+ 2
IWD=IST+ IX
XM(IWD) =XM(IWD) + Y
GO TO 56
18 IX= IFIX((X-XMN)/DEX+2.)
IY= IFIX((Y-YMN)/DEY+2.)
IF(IX.LT.1) IX=1
IF(IY.LT.1) IY=1
IF(IX.GT.NBX+2) IX=NBX+2
IF(IY.GT.NBY+2) IY=NBY+2
ILOC=(IY-1)*(NBX+2) + (IX+ IST -1)
IWD=ILOC/NBT +1
JBT=MOD(ILOC,NBT) +1
NOO1=MA(IWD)/IBT(JBT)
NO=MAND(NOO1,IHK)
MAA1=MA(IWD)
MAA2=IZB(JBT)
MA(IWD)=MAND(MAA1,MAA2)
IF(NO.LT.31) NO=NO+1
MAA3=MA(IWD)
MAA4=NO*IBT(JBT)
MA(IWD)=MOR(MAA3,MAA4)
MA(IPLT) = MA(IPLT) + 1
GO TO 56
19 IF(1 .LE.IPLT.AND.IPLT.LE.NPLTS) GO TO 20
WRITE(NOUT,58) IPLT
GO TO 56
20 DO 21 I=1,8
J= (I-1)*NPLTS + IPLT
21 INDEXV(I) = MA(J)
IF(NDM.EQ.1) GO TO 22
IF(NDM.GE.2) GO TO 39
WRITE(NOUT,72) IPLT
GO TO 56
22 WRITE(NOUT,62) IPLT, (TITLE(I), I=1,15)
IYMN =IFIX(YMN+.5)
IDEY = IFIX(DEY + .5)
IF(IDEY .LE. 0) IDEY = 1
NE=NBX+1
C CODE ADDED TO SCALE PLOTS IF DESIRED AND REQUIRED
IF (X.NE.RS) GO TO 2005
MAXY=-1
DO 2010 I=2,NE
J=IST+I
K=IFIX(XM(J)+.5)-IYMN
IF (K.GT.MAXY) MAXY=K
2010 CONTINUE
K=MAXY
IF (K.LE.NBY*IDEY) GO TO 2005
C MUST INCREASE IDEY TO MAKE PLOT FIT
IDEY=K/NBY+1
DEY=10*IDEY
CALL HIHDIG(DEY,ID,IS)
IF (DEY.EQ.10.*IS) GO TO 2016
ID=ID+1
2016 IDEY=ID*10.**IS
IDEY=IDEY/10
DEY=IDEY
2005 CONTINUE
WT = 0.0
MAXY= 10*IDEY
AVG=0.
WAG=0.
AGG=-.5
DO 23 I=2,NE
J= IST + I
ZXM=XM(J)
WT=WT+ZXM
AGG=AGG+1.
WAG=WAG+AGG*ZXM
K = IFIX(XM(J) + .5) - IYMN
IF(K.GT.MAXY) MAXY=K
K= K - NBY*IDEY
IF(K.GT.31) K = 31
IF(K.LT.0.OR.X.EQ.RV) K=1
IF(X.EQ.PNC) K=1
23 LINE(I)=ICH(K)
WAG1=WAG/WT
AVG=(WAG1*DEX)
AGG=-.5
STD=0.
DO 232 I=2,NE
J=IST+I
ZXM=XM(J)
AGG=AGG+1.
STDIF=ZXM*(AGG-WAG1)*(AGG-WAG1)
STD=STD+STDIF
232 CONTINUE
STDEV=DEX*SQRT(STD/WT)
AVG=AVG+XMN
MAXY= ((MAXY-1)/(10*IDEY))*10 +10
IF((MAXY.LT.NBY.AND.X.EQ.RH).OR.X.EQ.RV) NBY=MAXY
IF(X.EQ.PNC) NBY=MAXY
WRITE(NOUT,63) (LINE(L),L=2,NE)
C WRITE(NOUT,64)
N = NE/5 -1
INEE=NBX+2
DO 25 I=1,NBX
KNBX=I/10
LNBX=10*KNBX
MNBX=I-LNBX
LINE(I)=ICHP
IF(MNBX.EQ.1) LINE(I)=ICHX
IF(MNBX.EQ.2) LINE(I)=ICHX
25 CONTINUE
LINE(NBX+1)=ICHX
LINE(NBX+2)=ICHX
WRITE(NOUT,765) YLABL,(LINE(L),L=1,INEE)
N = NBY - 9
I = N
133 IY = (I+9)*IDEY + IYMN
ILOW = IY - IDEY
DO 26 J=2,NE
K = IST + J
L = IFIX(XM(K) + .5) - ILOW
LINE(J)=ICH(1)
IF (L.LE.0) GO TO 26
LINE(J) = ICHX
IF(L .GE. IDEY) GO TO 26
IF(L.GT.31) L=31
LINE(J)=ICH(L+1)
26 CONTINUE
NEEE=NE+1
LINE(NEEE)=ICHX
ME=NE+1
WRITE(NOUT,66) IY,ICHX, (LINE(L),L=2,ME)
J = 9
130 ILOW= (I-2 +J)*IDEY + IYMN
DO 28 K=2,NE
M = IST + K
NO = IFIX(XM(M) + .5) - ILOW
LINE(K) = ICH(1)
IF(NO.LE.0) GO TO 28
LINE(K) = ICHX
IF(NO.GE.IDEY) GO TO 28
IF(NO.GT.31) NO=31
LINE(K) = ICH(NO+1)
28 CONTINUE
NEEE=NE+1
LINE(NEEE)=ICHP
ME=NE+1
30 WRITE(NOUT,67) ICHP,(LINE(L),L=2,ME)
J = J - 1
IF(J .GE. 2) GO TO 130
ILOW=(I-1)*IDEY + IYMN
DO 31 J=1,NE
K = IST + J
NO = IFIX(XM(K) + .5) -ILOW
LINE(J)=ICH(1)
IF(NO.LE.0) GO TO 31
LINE(J) = ICHX
IF(NO .GE.IDEY) GO TO 31
IF(NO.GT.31) NO=31
LINE(J)=ICH(NO+1)
31 CONTINUE
NEEE=NE+1
LINE(NEEE)=ICHX
ME=NE+1
33 WRITE(NOUT,67) ICHX, (LINE(L),L=2,ME )
I = I- 10
IF(I .GE. 1) GO TO 133
N =NE/5 -1
INEE=NBX+2
DO 34 I=1,NBX
KNBX=I/10
LNBX=10*KNBX
MNBX=I-LNBX
LINE(I)=ICHP
IF(MNBX.EQ.1) LINE(I)=ICHX
IF(MNBX.EQ.2) LINE(I)=ICHX
34 CONTINUE
LINE(NBX+1)=ICHX
LINE(NBX+2)=ICHX
WRITE(NOUT,768) IYMN,(LINE(L),L=1,INEE)
N=NE/10 +1
DO 35 I=1,N
35 XL(I) = FLOAT(I-1)*DEX*10.0 + XMN
WRITE(NOUT,69) (XL(L),L=1,N)
C WRITE(NOUT,64)
DO 36 I=2,NE
J=IST + I
NO = IFIX(XM(J) + .5) - IYMN
LINE(I) =ICH(1)
IF(NO.GE.0) GO TO 36
NO =-NO
IF (NO.GT.31) NO=31
LINE(I) = ICH(NO+1)
36 CONTINUE
WRITE(NOUT,63) (LINE(L),L=2,NE)
J=IST+1
JUND=IFIX(XM(J)+.5) - IYMN
J=IST+NBX+2
JOVR=IFIX(XM(J)+.5) - IYMN
C WRITE(NOUT,64)
LNX=0
DO 1907 I=2,NE
J=IST+I
JA1(1)=ICH(1)
KA1(1)=ICH(1)
MNX=IFIX(XM(J)+.5)
IPNCH(I-1)=MNX
7777 FORMAT(20I4)
LNX=LNX+MNX
J1=MNX/100
K1=(MNX-100*J1)/10
L1=MNX-100*J1-10*K1
IF(J1.GT.30) J1=31
IF((MNX.GE.100).AND.(K1.EQ.0)) K1=24
IF((MNX.GE. 10).AND.(L1.EQ.0)) L1=24
JA1(I)=ICH(J1+1)
JA2(I)=ICH(K1+1)
JA3(I)=ICH(L1+1)
J1=LNX/1000
K1=(LNX-1000*J1)/100
L1=(LNX-1000*J1-100*K1)/10
M1=LNX-1000*J1-100*K1-10*L1
IF(J1.GT.30) J1=31
IF((LNX.GE.1000).AND.(K1.EQ.0))K1=24
IF((LNX.GE. 100).AND.(L1.EQ.0))L1=24
IF((LNX.GE. 10).AND.(M1.EQ.0))M1=24
KA1(I)=ICH(J1+1)
KA2(I)=ICH(K1+1)
KA3(I)=ICH(L1+1)
KA4(I)=ICH(M1+1)
1907 CONTINUE
IWTA=WT
IF(IXTR.GE.1)GOTO 8200
C PUT OUT CRUDE OVER/UNDERFLOW AND STATISTICS. SKIP IF
C IXTR=1 SO TERMINAL GRAPHS WILL FIT.
WRITE(6,76) JUND,IWTA,XLABL,JOVR,AVG,STDEV
76 FORMAT(5X,'UNDERFLOW =',I4,2X,'TOTAL IN PLOT =',I5,4X,2A4,4X,
1 'OVERFLOW =',I4,4X,'AVERAGE = ',1PE10.3,2X,'STAND. DEV = ',
2 1PE10.3 /)
IF(X.EQ.PNC)WRITE(7,7777) (IPNCH(L),L=1,NBX)
WRITE(6,1743)
WRITE(6,1744) (JA1(L),L=2,NE)
WRITE(6,1744) (JA2(L),L=2,NE)
WRITE(6,1744) (JA3(L),L=2,NE)
WRITE(6,1745)
WRITE(6,1744) (KA1(L),L=2,NE)
WRITE(6,1744) (KA2(L),L=2,NE)
WRITE(6,1744) (KA3(L),L=2,NE)
WRITE(6,1744) (KA4(L),L=2,NE)
1743 FORMAT(50X,'EVENTS PER BIN')
1745 FORMAT(50X,'INTEGRAL OF EVENTS')
1744 FORMAT(15X,115A1)
8200 CONTINUE
DO 38 I=1,19
38 TITLE(I) = BLANK
GO TO 56
39 WRITE(NOUT,62) IPLT,(TITLE(I),I=1,15)
NE = NBX +2
DO 40 I=1,NE
ILOC = IST + (NBY+1)*NE +I -1
IWD = ILOC/NBT +1
JBT = MOD(ILOC,NBT) + 1
NOO1=MA(IWD)/IBT(JBT)
NO=MAND(NOO1,IHK)
40 LINE(I) = ICH(NO+1)
ITEMP = LINE(NE)
DO 41 I=1,6
MMME=NE+I-1
41 LINE(MMME)=ICH(1)
LINE(NE+6) = ITEMP
ME = NE +6
WRITE(NOUT,63) (LINE(L),L=1,ME)
C WRITE(NOUT,64)
N = NE/5 -1
INEE=NBX+2
DO 42 I=1,NBX
KNBX=I/10
LNBX=10*KNBX
MNBX=I-LNBX
LINE(I)=ICHP
IF(MNBX.EQ.1) LINE(I)=ICHX
IF(MNBX.EQ.2) LINE(I)=ICHX
42 CONTINUE
LINE(NBX+1)=ICHX
LINE(NBX+2)=ICHX
WRITE(NOUT,8799) YLABL,(LINE(L),L=1,INEE)
MN=N+2
N = NBY -9
I = N
150 YL = FLOAT(I+9)*DEY+YMN
DO 43 J=1,NE
ILOC = IST + (I+9)*NE +J -1
IWD = ILOC/NBT + 1
JBT = MOD(ILOC,NBT) +1
NOO1=MA(IWD)/IBT(JBT)
NO=MAND(NOO1,IHK)
43 LINE(J) = ICH(NO+1)
ITEMP = LINE(NE)
LINE(NE) = ICHX
DO 44 J=1,5
44 LINE(NE+J) = ICH(1)
LINE(NE+6) = ITEMP
ME =NE +6
CALL SHADER (LINE,NE,X)
WRITE(NOUT,70) LINE(1),YL,ICHX,(LINE(L),L=2,ME)
CALL RESHD(X)
J = 9
147 IY = IST + (I + J -1)*NE - 1
DO 45 K =1,NE
ILOC = IY + K
IWD = ILOC/NBT + 1
JBT = MOD(ILOC,NBT) +1
NOO1=MA(IWD)/IBT(JBT)
NO=MAND(NOO1,IHK)
45 LINE(K) = ICH(NO+1)
ITEMP = LINE(NE)
LINE(NE) = ICHP
MME=NE+1
MMME=NE+5
DO 46 K=MME,MMME
46 LINE(K) = ICH(1)
LINE(NE+6) = ITEMP
ME =NE+6
47 CALL SHADER(LINE,NE,X)
WRITE (6,767) LINE(1),ICHP,(LINE(L),L=2,ME)
CALL RESHD(X)
J = J-1
IF(J .GE. 2) GO TO 147
IY =IST + I*NE -1
DO 48 J=1,NE
ILOC = IY + J
IWD = ILOC/NBT + 1
JBT = MOD(ILOC,NBT) + 1
NOO1=MA(IWD)/IBT(JBT)
NO=MAND(NOO1,IHK)
48 LINE(J)=ICH(NO+1)
ITEMP = LINE(NE)
LINE(NE)=ICHX
KKE=NE+1
KKKE=NE+5
DO 49 J=KKE,KKKE
49 LINE(J) = ICH(1)
LINE(NE+6) = ITEMP
ME = NE +6
50 CALL SHADER(LINE,NE,X)
WRITE (6,767) LINE(1),ICHX,(LINE(L),L=2,ME)
CALL RESHD(X)
I = I - 10
IF(I .GE. 1) GO TO 150
N =NE/5 -1
INEE=NBX+2
DO 51 I=1,NBX
KNBX=I/10
LNBX=10*KNBX
MNBX=I-LNBX
LINE(I)=ICHP
IF(MNBX.EQ.1) LINE(I)=ICHX
IF(MNBX.EQ.2) LINE(I)=ICHX
51 CONTINUE
LINE(NBX+1)=ICHX
LINE(NBX+2)=ICHX
WRITE(NOUT,771) YMN,(LINE(L),L=1,INEE)
N =NE/10 +1
DO 52 I=1,N
52 XL(I) = FLOAT(I-1)*DEX*10. +XMN
WRITE(NOUT,69) (XL(L),L=1,N)
C WRITE(NOUT,64)
IY=IST-1
DO 53 I=1,NE
ILOC=IY+I
IWD =ILOC/NBT + 1
JBT = MOD(ILOC,NBT) + 1
NOO1=MA(IWD)/IBT(JBT)
NO=MAND(NOO1,IHK)
53 LINE(I) = ICH(NO+1)
ITEMP = LINE(NE)
KLE=NE+5
DO 54 I=NE,KLE
54 LINE(I) = ICH(1)
LINE(NE+6)=ITEMP
ME = NE +6
WRITE(NOUT,63) (LINE(L),L=1,ME)
NO = MA(IPLT) - 2
WRITE(NOUT,74) NO,XLABL
DO 55 I=1,19
55 TITLE(I) = BLANK
56 RETURN
57 FORMAT(' ILLEGAL ENTRY NO.',I8)
58 FORMAT(' ILLEGAL PLOT NO.', I8)
59 FORMAT(' ZERO BIN WIDTH ON PLOT',I5)
60 FORMAT('ILLEGAL DIMENSIONALITY FOR PLOT',I5)
61 FORMAT(' NOT ENOUGH MEMORY LEFT FOR PLOT',I5)
62 FORMAT('1',10X,'PLOT NUMBER',I5,10X,15A4)
63 FORMAT(15X,117A1)
C64 FORMAT()
65 FORMAT(1X,2A4,4X,23A5)
66 FORMAT(2X,I11,1X,118A1)
67 FORMAT(14X,118A1)
68 FORMAT(1X,I11,1X,23A5)
69 FORMAT(9X,12(1PE10.2))
70 FORMAT(2X,A1,1PE11.2,1X,118A1)
71 FORMAT(2X,1PE11.2,1X,23A5)
72 FORMAT(' PLOT NUMBER',I5,' NOT SUCCESSFULLY INITIATED.')
73 FORMAT(' TOTAL WEIGHT OF EVENTS PLOTTED =',F10.1,10X,2A4)
74 FORMAT(' NUMBER OF EVENTS PLOTTED =',I8,'.',10X,2A4)
75 FORMAT(1X,I5,' WORDS OF PLOTTING AREA USED,'
1 ' INCLUDING PLOT',I4,'.')
C 76 FORMAT(20X,'UNDERFLOW = ',I5,10X,'OVERFLOW = ',I5,10X,'AVERAGE = '
C 1 ,1PE10.3,5X,'ST. DEV = ',1PE10.3)
165 FORMAT(2X,2A4,4X,23A5)
8799 FORMAT(2X,2A4,5X,114A1)
771 FORMAT(2X,1PE11.2,2X,114A1)
765 FORMAT(2X,2A4,4X,114A1)
768 FORMAT(2X,I11,1X,114A1)
767 FORMAT(2X,A1,12X,114A1)
END
SUBROUTINE RASSIG(IUNIT,NAME)
C
CHARACTER*1 NAME(50)
INTEGER*4 IUNIT
CHARACTER*20 WK
CHARACTER*1 WK1(20)
EQUIVALENCE(WK,WK1(1))
C JUST TRY AND NULL FILL A NAME TO USE.
DO 1 N=1,20
WK1(N)=' '
1 CONTINUE
DO 2 N=1,20
II=ICHAR(NAME(N))
IF(II.LT.32)GOTO 3
WK1(N)=CHAR(II)
C1 CONTINUE
2 CONTINUE
3 OPEN(IUNIT,FILE=WK,STATUS='OLD',ACCESS='SEQUENTIAL',
1 FORM='FORMATTED')
RETURN
END
SUBROUTINE RESHD(X)
IMPLICIT INTEGER (A-Z)
DIMENSION HLINE(120),OLINE(120)
COMMON/HLNNN/HLINE,OLINE,M
CHARACTER*1 IICH,IJCH
DIMENSION IICH(32),IJCH(32)
DIMENSION ICH(32),JCH(32)
INTEGER*4 RQ,BL
CHARACTER*4 CRQ,CBL
EQUIVALENCE(CRQ,RQ),(CBL,BL)
DATA CRQ/' Q'/
DATA CBL/' '/
DATA IICH/' ','1','2','3','4','5','6','7','8','9','A','B',
1 'C','D','E','F','G','H','I','J','K','L','M','N','O','P',
1 'Q','R','S','T','U','*'/
DATA IJCH/'+','=',' ','=',' ','*',' ',' ',' ','X',' ',' ',' ',
1 ' ','A',' ','B',' ',' ',' ','E',' ',' ',' ','H',' ','Q',
1 ' ','Z','I','O','0'/
DATA INIT/0/
IF(INIT.NE.0)GOTO 7009
INIT=1
DO 7109 N=1,32
ICH(N)=ICHAR(IICH(N))
JCH(N)=ICHAR(IJCH(N))
BL=32
7109 CONTINUE
7009 CONTINUE
IF (X.NE.RQ) RETURN
M=M-1
DO 155 I=1,M
DO 15 J=1,32
IF (HLINE(I).EQ.ICH(J)) GO TO 155
15 CONTINUE
J=1
155 HLINE(I)=J
DO 1600 I=1,32
IF (JCH(I).EQ.BL) GO TO 1600
IP=0
DO 1560 J=1,M
OLINE(J)=BL
IF (HLINE(J).LE.I) GO TO 1560
OLINE(J)=JCH(I)
IP=1
1560 CONTINUE
IF (IP.EQ.0) RETURN
WRITE (6,1605) (OLINE(J),J=1,M)
1600 CONTINUE
1605 FORMAT ('+',15X,120A1)
RETURN
END
SUBROUTINE SHADER(LINE,ME,X)
IMPLICIT INTEGER (A-Z)
DIMENSION LINE(ME),HLINE(120),OLINE(120)
COMMON/HLNNN/HLINE,OLINE,M
C DIMENSION ICH(32),JCH(32)
CHARACTER*4 CRQ
INTEGER*4 RQ
EQUIVALENCE(CRQ,RQ)
DATA CRQ/' Q'/
DATA BL/32/
C DATA ICH/' ','1','2','3','4','5','6','7','8','9','A','B',
C 1 'C','D','E','F','G','H','I','J','K','L','M','N','O','P',
C 1 'Q','R','S','T','U','*'/
C DATA JCH/'+','=',' ','=',' ','*',' ',' ',' ','X',' ',' ',' ',
C 1 ' ','A',' ','B',' ',' ',' ','E',' ',' ',' ','H',' ','Q',
C 1 ' ','Z','I','O','0'/
IF (X.NE.RQ) RETURN
IF (ME.GT.120) RETURN
M=ME-1
DO 10 I=2,M
HLINE(I-1)=LINE(I)
LINE(I)=BL
10 CONTINUE
RETURN
END
SUBROUTINE WASSIG(IUNIT,NAME)
C
CHARACTER*1 NAME(50)
INTEGER*4 IUNIT
CHARACTER*20 WK
CHARACTER*1 WK1(20)
EQUIVALENCE(WK,WK1(1))
C JUST TRY AND NULL FILL A NAME TO USE.
DO 1 N=1,20
WK1(N)=' '
1 CONTINUE
DO 2 N=1,20
II=ICHAR(NAME(N))
IF(II.LT.32)GOTO 3
WK1(N)=CHAR(II)
C1 CONTINUE
2 CONTINUE
3 OPEN(IUNIT,FILE=WK,STATUS='NEW',ACCESS='SEQUENTIAL',
1 FORM='FORMATTED')
RETURN
END