File: AXIS.FS of Tape: Various/Decus/decus-4
(Source file text) 

C	AXIS SUBROUTINE FOR OS/8 FORTRAN 4
C	BASED ON DEC'S ROUTINE AXIS.FS
C	WRITTEN ON 27-SEP-78 BY J. MAURISSEN &
C	 A. VAN DER HEIDE
C	UNIVERSITY OF ROCHESTER
C	DEPARTMENT OF RADIATION BIOLOGY AND
C	 BIOPHYSICS
C	BEHAVIOR LABORATORY
C	ROCHESTER      N.Y. 14642
C
	SUBROUTINE AXIS(XAX,YAX,TITLE,NCHR,AXLEN,ANG,
     1	FV,DV,LOGCYC)
	DATA PFCT/'*10'/
C-WHEN LOG AXES ARE USED THE FOLLOWING CODE
C-PREVENTS ILLEGAL STARTING POINTS, I.E. NEGATIVE
C-OR NOT EQUAL TO 10**I, I BEING A POSITIVE OR
C-NEGATIVE INTEGER.
	LLFT=0
	IF(FV.LE.0.AND.LOGCYC.NE.0)GO TO 140
	IF(LOGCYC.EQ.0.OR.FV.EQ.0)GO TO 3
	AFV=ABS(FV)
 105	IF(AFV.GT.0.5)GO TO 100
	AFV=AFV*10
	GO TO 105
 100	IF(AFV.LT.5)GO TO 110
	AFV=AFV/10.
	GO TO 100
 110	IFV=IFIX(AFV+.01)
	IF(IFV.NE.1)GO TO 140
 3	ICW=-1
	IF(NCHR.GE.0) ICW=1
	ZANG=ANG
 4	IF(ZANG.LT.0)ZANG=ZANG+360
	IF(ZANG.GT.360)ZANG=ZANG-360
	IF(ZANG.GT.360.OR.ZANG.LT.0)GO TO 4
	CALL XYPLOT(XAX,YAX,-3)
C-MOVE TO START OF AXIS
	XPT=ZANG*.017453294
	CANGL=COS(XPT)
	SANGL=SIN(XPT)
	AD=ICW*SANGL
	AFV=.1*SANGL*ICW
	ADV=.1*CANGL*ICW
	XPT=0
	YPT=0
	IXLEN=ABS(AXLEN)
	IF(LOGCYC.EQ.0) GO TO 2
	IXLEN=ABS(LOGCYC)
	CYCINC=ABS(AXLEN)/ABS(LOGCYC)
 2	DO 10 ICHAR=0,IXLEN
	CALL XYPLOT(XPT,YPT,2)
	IF(LOGCYC.NE.0) GO TO 5
	XTIC=XPT-AFV
	YTIC=YPT+ADV
C-DRAW THE TIC MARKS ON LINEAR AXES
	CALL XYPLOT(XTIC,YTIC,2)
	CALL XYPLOT(XPT,YPT,3)
	XPT=CANGL*(ICHAR+1)
	YPT=SANGL*(ICHAR+1)
	GO TO 10
C-DRAW TIC MARKS ON LOGARITHMIC SCALE
 5	AFV2=AFV*2
	ADV2=ADV*2
	XTIC=XPT-AFV2
	YTIC=YPT+ADV2
	CALL XYPLOT(XTIC,YTIC,2)
	CALL XYPLOT(XPT,YPT,3)
	IF(ICHAR.EQ.IXLEN) GO TO 10
	DO 6 ILOG=1,9
	ANT=ILOG+1
C-TEST FOR REVERSE LOGARITHMIC SCALING
	IF (LOGCYC.LT.0) ANT=10./(10-ILOG)
	XPT=CANGL*ALOG10(ANT*10**ICHAR)*CYCINC
	YPT=SANGL*ALOG10(ANT*10**ICHAR)*CYCINC
	CALL XYPLOT(XPT,YPT,2)
	XTIC=XPT-AFV
	YTIC=YPT+ADV
	CALL XYPLOT(XTIC,YTIC,2)
	CALL XYPLOT(XPT,YPT,3)
 6	CONTINUE
 10	CONTINUE
	IEXP=1
	PWR=1
	AFV=ABS(FV)
	IF(LOGCYC.LT.0)AFV=1.0001*(FV/10.**ABS
     1	(LOGCYC))
	IF(AFV.EQ.0)AFV=ABS(DV)
	IF(AFV.GE.100) GO TO 30
	IF(AFV.LT.0.01) GO TO 40
C-IEXP=EXPONENT,PWR=POWER IN 10S
 20	IF(LOGCYC.EQ.0)YTIC=(FV+(DV*IXLEN))/PWR
	IF(LOGCYC.GT.0)YTIC=FV*10.**ABS(LOGCYC)/PWR
	IF(LOGCYC.LT.0)YTIC=AFV/PWR
	XPT=CANGL*ABS(AXLEN)-(.3*ICW-.05)*SANGL-
     1	.05*CANGL
	YPT=SANGL*ABS(AXLEN)+(.4*ICW-.05)*CANGL-
     1	.05*ABS(SANGL)
	DO 50 ICHAR=0,IXLEN
	NLFT=3
	IF(LOGCYC.EQ.0) GO TO 31
C-THIS CODE COMPUTES HOW MANY PLACES TO THE
C-RIGHT OF THE DECIMAL POINT THE LOGARITHMIC
C-LABEL WILL NEED.
	II=-1
	SUBFV=ABS(YTIC)
 34	IF(SUBFV.GE.1) GO TO 31
	SUBFV=SUBFV*10.
	II=II+1
	IF(II.EQ.0) II=1
	GO TO 34
C-NEXT THE LOCATION OF THE FIRST NUMBER IN THE LABEL 
C-IS CALCULATED.
 31	TST=ABS(YTIC)
 120	IF(TST.LT.10)GO TO 32
	TST=TST/10
	NLFT=NLFT+1
	GO TO 120
 32	IF(LOGCYC.NE.0)NLFT=NLFT-2+II
	IF(YTIC.LT.0)NLFT=NLFT+1
	IF(NLFT.GT.LLFT)LLFT=NLFT
	IF(LOGCYC.EQ.0)II=2
	OXPT=XPT
	IF(AD.GT.0)XPT=XPT-(.2+NLFT*.14)
C-NEXT PRINT THE NUMBER.
	CALL NUMBER(XPT,YPT,.14,YTIC,0,II)
	XPT=OXPT
	CALL XYPLOT(XPT,YPT,3)
	IF(LOGCYC.NE.0)GO TO 130
	XPT=XPT-CANGL
	YPT=YPT-SANGL
	YTIC=YTIC-DV/PWR
	GO TO 50
 130	XPT=XPT-CANGL*CYCINC
	YPT=YPT-SANGL*CYCINC
	YTIC=FV*10.**(LOGCYC-ICHAR-1)/PWR
	IF(LOGCYC.LT.0)YTIC=AFV*10.**(ICHAR+1)/PWR
 50	CONTINUE
	PWR=0
 55	IF(IEXP/10**PWR.LT.10)GO TO 60
	PWR=PWR+1
	GO TO 55
 60	ICHAR=ABS(NCHR)
	IF(IEXP.GT.1)PWR=PWR+4
C-FOR THE 10* CHARACTERS. PWR = # DIGITS
	ADV=(ABS(AXLEN)-(ICHAR+PWR)*.21)/2
	XTIC=ADV*CANGL-SANGL*ICW*(.65+LLFT*.14)
	IF(ZANG.GT.180.AND.ICW.LT.0)XTIC=XTIC-.21
	YPT=ADV*SANGL+ICW*.9*CANGL
	CALL SYMBOL(XTIC,YPT,.21,TITLE,ZANG,ICHAR)
C-PRINT THE TITLE
	IF(IEXP.LE.1) GO TO 70
	CALL WHERE(XTIC,YTIC,XPT)
	CALL SYMBOL(XTIC,YTIC,.21,PFCT,ZANG,3)
	IF(AFV.LT..01)IEXP=-IEXP+2
	CALL WHERE(XTIC,YTIC,XPT)
	CALL NUMBER(XTIC-.09*SANGL,YTIC+.09*CANGL,
     1	.21,IEXP-1,ZANG,-1)
C-PRINT THE EXPONENT
70	RETURN
30	XTIC=AFV/PWR
	IF(XTIC.LT.100) GO TO 20
	PWR=AINT(PWR*10)
	IEXP=IEXP+1
	GO TO 30
40	XTIC=AFV*PWR
	IF(XTIC.GE.0.01)GO TO 45
	PWR=PWR*10
	IEXP=IEXP+1
	GO TO 40
45	PWR=1/PWR
C-FOR THE DIVISION ABOVE
	GO TO 20
 140	WRITE(4,150)
 150	FORMAT(' WARNING! STARTING VALUE ',
     1	'ILLEGAL FOR LOG AXES')
	GO TO 70
	END