src
|
chk2psi.f,
chk2psi92.f,
chk2psi92.f.txt,
ctplot.f,
gksplot.f,
hpplot.f,
makefile,
preplot.f,
psi1.f,
psi2.f,
psicon.f,
psplot.f
|
|
|
C
C Calcomp compatible HPGL plotting library
C
C (TO USE X-ON / X-OFF )
C HP Plotter library used in
C William Jorgensen's research group
C Laboratory of Computational Chemistry, Yale University.
C
SUBROUTINE AXIS (X,Y,STRING,NS,SIZE,ANGLE,ZMIN,ZDEL,LROT,IFORM)
DIMENSION WW(2),XX(2,4),YY(2,4),ZZ(2,4)
CHARACTER*8 ARRAY
CHARACTER*1 STRING(96)
DATA ARRAY / '(X10 )'/
DATA WW / -0.1,+0.1 /
DATA XX / -0.25,-0.25,+0.05,+0.05,+0.25,+0.25,-0.05,-0.05 /
DATA YY / -0.25,+0.15,-0.65,+0.15,-0.15,+0.25,-0.15,+0.65 /
DATA ZZ / -0.43,+0.29,-0.83,+0.69,-0.43,+0.29,-0.83,+0.69 /
DATA IZERO / 0 /
C
C INITIALIZATION
C
C = COS(.01745329*ANGLE)
S = SIN(.01745329*ANGLE)
T = ANGLE+90.*LROT
C
K = ABS(NS)
L = MAX0(MIN0(NS,1),0)+1
M = MOD(MOD(LROT,4)+4,4)+1
N = SIZE+.99
C
C PLOT NUMBER ANNOTATION ALONG AXIS
C
AXP = LOG10(100.001*AMAX1(ABS(ZMIN),ABS(ZMIN+N*ZDEL)))
IXP = INT(AXP)
JXP = IXP
IF (AXP.LT.0.0) THEN
JXP = IXP-1
IXP = JXP
ENDIF
IF ((JXP.LE.0).OR.(JXP.GT.6)) JXP = 1
IF ((IXP.NE.JXP).AND.(AXP.LT.IXP+0.0000086)) JXP = 2
D = 10.0**(IXP-JXP)
XA = X+XX(L,M)*C-YY(L,M)*S-0.20*S
YA = Y+XX(L,M)*S+YY(L,M)*C+SIGN(0.1*C,FLOAT(NS))
ZA = ZMIN/D
DO 10 I = IZERO, N
CALL NUMBER (XA,YA,0.15,ZA,T,IFORM)
XA = XA+C
YA = YA+S
ZA = ZA+ZDEL/D
10 CONTINUE
C
C PLOT AXIS AND TIC MARKS
C
XB = X+N*C
YB = Y+N*S
XA = XB-WW(L)*S
YA = YB+WW(L)*C
CALL PLOT (XA,YA,3)
DO 20 I = 1, N
CALL PLOT (XB,YB,2)
XB = XB-C
YB = YB-S
CALL PLOT (XB,YB,2)
XA = XA-C
YA = YA-S
CALL PLOT (XA,YA,2)
20 CONTINUE
C
C PLOT IDENTIFICATION LABEL ALONG AXIS
C
T = 0.5*N-0.06*K-0.42*MIN(ABS(IXP-JXP),1)
XA = X+T*C-ZZ(L,M)*S-0.20*S
YA = Y+T*S+ZZ(L,M)*C+SIGN(0.20*C,FLOAT(NS))
CALL SYMBOL (XA,YA,.15,STRING,ANGLE,K)
IF (IXP.EQ.JXP) RETURN
XA = XA+0.12*(K+1)*C
YA = YA+0.12*(K+1)*S
CALL SYMBOL (XA,YA,.15,ARRAY,ANGLE,8)
XA = XA+0.48*C-0.07*S
YA = YA+0.48*S+0.07*C
XYZ = FLOAT(IXP-JXP)
CALL NUMBER (XA,YA,.15,XYZ,ANGLE,8)
RETURN
END
C
C
SUBROUTINE LINE (X,Y,N,K,J,OCSYM)
CHARACTER STROCS
INTEGER OCSYM
DIMENSION X(1),Y(1)
C
C PLOT PAIRS X,Y SCALED TO MINIMUM OF
C X(N*K+1),Y(N*K+1), AND INCREMENT PER INCH
C OF X(N*(K+1)),Y(N*(K+1)).
C
C X = HORIZONTAL ARRAY OF POINTS
C Y = VERTICAL ARRAY OF POINTS
C N = # OF PAIRS OF POINTS TO PLOIT IN X AND Y
C K = PLOT N POINTS FROM THE 1ST, K+1ST, 2,K+1ST, ETC..
C POSITIONS OF ARRAYS X AND Y.
C J = >0: PLOT SYMBOL OCSYM (HOLLERITH) EACH JTH POINT
C WITH CONNECTED LINE
C J = 0: PLOT ONLY THE LINE.
C J = <0: PLOT ONLY THE SYMBOLS EACH JTH POINT.
C
N1 = N*K
IM = N1+1
ID = IM+K
IF (X(ID).EQ.0.OR.Y(ID).EQ.0) RETURN
IPEN = 2
M = J
IF (J.LT.0) THEN
M = -M
IPEN = 3
ENDIF
X1 = (X(1)-X(IM))/X(ID)
Y1 = (Y(1)-Y(IM))/Y(ID)
CALL PLOT (X1,Y1,3)
JCNT = 0
DO 10 I = 1, N1, K
JCNT = JCNT+1
XP = (X(I)-X(IM))/X(ID)
YP = (Y(I)-Y(IM))/Y(ID)
IF (J.NE.0) THEN
IF (M.NE.JCNT) GO TO 10
JCNT = 0
ENDIF
CALL PLOT (XP,YP,IPEN)
IF (J.NE.0) THEN
STROCS = CHAR(OCSYM)
CALL SYMBOL (XP,YP,.14,STROCS,0.,-1)
CALL PLOT (XP,YP,3)
ENDIF
10 CONTINUE
RETURN
END
C
C
SUBROUTINE DSHLIN (X,Y,N,DSH,GAP,NSEC)
INTEGER PEN
DIMENSION X(1),Y(1),DSH(1),GAP(1)
C
IF (NSEC.NE.0) THEN
C
C INITIALIZE
C
K = 1
PEN = 2
S = 0.0
T = DSH(1)
XMIN = X(N+1)
XINC = X(N+2)
YMIN = Y(N+1)
YINC = Y(N+2)
C
C MOVE TO FIRST POINT
C
X2 = (X(1)-XMIN)/XINC
Y2 = (Y(1)-YMIN)/YINC
CALL PLOT (X2,Y2,3)
C
C PLOT DASHED LINE CURVE
C
DO 20 I = 2, N
10 X1 = X2
Y1 = Y2
X2 = (X(I)-XMIN)/XINC
Y2 = (Y(I)-YMIN)/YINC
D = SQRT((X2-X1)**2+(Y2-Y1)**2)
S = S+D
IF (S.GE.T) THEN
X2 = X2+(X1-X2)*(S-T)/D
Y2 = Y2+(Y1-Y2)*(S-T)/D
CALL PLOT (X2,Y2,PEN)
PEN = 5-PEN
S = 0.0
T = GAP(K)
IF (PEN.EQ.3) GO TO 10
K = MOD(K,NSEC)+1
T = DSH(K)
GO TO 10
ENDIF
CALL PLOT (X2,Y2,PEN)
20 CONTINUE
RETURN
ENDIF
CALL LINE (X,Y,N,1,0,0)
RETURN
END
C
C
SUBROUTINE FACTOR (A)
COMMON /HSCALE/ SFACTH
SFACTH = A
RETURN
END
C
C
SUBROUTINE NUMBER (X,Y,HEIGHT,XNUM,ANGLE,IJK)
C
C USE THE FORMAT TO PLOT AN INTEGER NUMBER
C MAX. NUMBER OF CHARACTERS IS 96
C
CHARACTER*1 IWK(96)
CHARACTER*6 IFORM(17)
DATA IFORM / '(F6.4)','(F6.3)','(F6.2)','(F6.1)','(F6.0)','(F5.0)'
* ,'(F5.1)','(I4) ','(I3) ','(I2) ','(I6) ','(I1) ','(I5) '
* ,'(F3.1)','(F4.1)','(F4.2)','(F5.2)'/
DATA IWK / 96*' '/
C
C CHECK TO SEE IF "I" OR "O" FORMAT IS REQUESTED
C
IF ((IJK.LE.7).OR.(IJK.GE.14)) THEN
C
C ENCODE A REAL NUMBER
C
WRITE(IWK,IFORM(IJK))XNUM
C
C ENCODE (96,IFORM(IJK) ,IWK)XNUM
C
ELSE
C
C ENCODE AN INTEGER NUMBER - INTERNAL WRITE IS STANDARD, ENCODE IS NOT
C
NUM = INT(XNUM)
WRITE(IWK,IFORM(IJK)) NUM
C
C ENCODE (99,IFORM(IJK) ,IWK)NUM
C
ENDIF
DO 10 I = 1, 96
N = 97-I
IF (IWK(N).NE.' ') GO TO 20
10 CONTINUE
RETURN
20 CALL SYMBOL (X,Y,HEIGHT,IWK,ANGLE,N)
RETURN
END
C
C
SUBROUTINE SCALE (X,S,N,K)
DIMENSION X(1),T(3)
DATA T / 1.0,2.0,5.0 /
M = N*K
XMAX = X(1)
XMIN = X(1)
DO 10 I = 1, M, K
XMAX = AMAX1(X(I),XMAX)
XMIN = AMIN1(X(I),XMIN)
10 CONTINUE
X0 = 0.0
DX = 1.7E38
W = 0.99999*(XMAX-XMIN)/S
IF (W.EQ.0.0) W = 0.99999/S
DO 20 I = 1, 3
B = 1.0+LOG10(W/T(I))
IF (B.LT.0.0) B = B-1.0
C = T(I)*10.0**INT(B)
IF (C.LE.DX) THEN
D = C*INT(1.00001*XMIN/C)
IF (XMIN.LT.D) D = D-C
IF (1.00001*S*C+D.GE.XMAX) THEN
X0 = D
DX = C
ENDIF
ENDIF
20 CONTINUE
X(M+1) = X0-DX*INT((S-(XMAX-XMIN)/DX)/2.0)
X(M+K+1) = DX
RETURN
END
C
C
SUBROUTINE SYMBOL (X1,Y1,HEIGHT,STR,THETA,NCHAR)
COMMON /VARH/ IHMODE,IHORGX,IHORGY,IHVECT,IHXCUR,IHYCUR
COMMON /HSCALE/ SFACTH
COMMON /PASS/ ITYP
C
C OUTPUT A CHARACTER STRING
C
CHARACTER*1 STR(*),TERMIN
C
TERMIN = CHAR(3)
H = HEIGHT
W = HEIGHT*2.0/3.0
NC = NCHAR
IF (NC.EQ.0) RETURN
TH = THETA*0.017453
SI = SIN(TH)
CO = COS(TH)
SI = MOD(SI,128.0)
CO = MOD(CO,128.0)
WRITE (66,'(1X,A,F9.4,A,F9.4,A)') 'DI ',CO,',',SI,TERMIN
WRITE (66,'(1X,A,F9.4,A,F9.4,A)') 'SI ',W,',',H,TERMIN
X2 = X1*1000.*SFACTH
Y2 = Y1*1000.*SFACTH
IX = X2
IY = Y2
IDX = IX-IHXCUR
IDY = IY-IHYCUR
IHXCUR = IX
IHYCUR = IY
IX = IHXCUR+IHORGX
IY = IHYCUR+IHORGY
C
WRITE (66,'(1X,A,I8,A,I8,A)') 'PU ',IDX,',',IDY,';'
WRITE (66,'(1X,168A)') 'LB',(STR(I),I=1,NC),TERMIN
C WRITE (66,'(1X,A)')' PU 0,0;'
WRITE (66,'(1X,A,I8,A,I8,A)') 'PA ',IX,',',IY,';'
WRITE (66,'(1X,A)')' PR 0,0;'
C
RETURN
END
C
C
SUBROUTINE WHERE (X,Y,FACTR)
C
C RETURN THE CURRENT PEN POSITION AND SCALE FACTOR
C
COMMON /VARH/ IHMODE,IHORGX,IHORGY,IHVECT,IHXCUR,IHYCUR
COMMON /HSCALE/ SFACTH
X = IHXCUR/(1000.0*SFACTH)
Y = IHYCUR/(1000.0*SFACTH)
FACTR = SFACTH
RETURN
END
C
C **********************************************************
C
SUBROUTINE PLOT (X,Y,I)
COMMON /VARH/ IHMODE,IHORGX,IHORGY,IHVECT,IHXCUR,IHYCUR
COMMON /HSCALE/ SFACTH
COMMON /PASS/ ITYP
IF (ABS(I).EQ.999) THEN
IF (ITYP.EQ.0) THEN
WRITE (66,20)
ELSE
WRITE (66,10)
ENDIF
10 FORMAT (' SP0 ; IN ; PG;')
20 FORMAT (' SP0 ; PU 10603,7721 ; IN ; PG;')
RETURN
ENDIF
IX = X*1000.*SFACTH
IY = Y*1000.*SFACTH
IDX = IX-IHXCUR
IDY = IY-IHYCUR
IHXCUR = IX
IHYCUR = IY
II = I
IF (I.LT.0) THEN
IHORGX = IHORGX + IX
IHORGY = IHORGY + IY
IHXCUR = 0.
IHYCUR = 0.
II = -I
ENDIF
IF (II.EQ.2) WRITE (66,30) IDX,IDY
IF (II.EQ.3) WRITE (66,40) IDX,IDY
IF (II.EQ.1) WRITE (66,50) IDX,IDY
RETURN
30 FORMAT (' PD ',I8,1X,I8,' ; ')
40 FORMAT (' PU ',I8,1X,I8,' ; ')
50 FORMAT (1X,I8,1X,I8,' ; ')
END
C
C ***********************************************************
C
SUBROUTINE PLOTS (ITYPE)
COMMON /VARH/ IHMODE,IHORGX,IHORGY,IHVECT,IHXCUR,IHYCUR
COMMON /HSCALE/ SFACTH
COMMON /PASS/ ITYP
CHARACTER ESC*1
C
C USE CALL PLOTS(0) FOR STANDARD 8.5 * 11 INCH PAPER
C USE CALL PLOTS(N) FOR ANY OTHER TYPE
C SET-UP X-ON / X-OFF PROTOCOL
C
ESC = CHAR(27)
WRITE (66,10)
10 FORMAT (' IN ; ')
WRITE (66,20) ESC
20 FORMAT (1X,A,'.I128;;17: ')
WRITE (66,30) ESC
30 FORMAT (1X,A,'.N;19: ')
ITYP = ITYPE
IHMODE = 1000
IF (ITYPE.NE.0) THEN
WRITE (66,40)
40 FORMAT (' PS1 ; SP1 ; PA 0,0 ; PR ;')
ELSE
WRITE (66,50)
ENDIF
50 FORMAT (' PS4 ; SP1 ; PA 0,0 ; PR ;')
C
C SET UP ORIGIN AND STARTING VECTOR TYPE
C
IHORGX = 0
IHORGY = 0
IHXCUR = 0
IHYCUR = 0
IHVECT = 3
SFACTH = 1.0
IF (ITYPE.NE.0) RETURN
CALL PLOT (0.0,0.0,-3)
RETURN
END
C
C
SUBROUTINE NEWPEN (ICLR)
C
ENTRY LINCLR(ICLR)
C
C SUBROUTINE TO SPECIFY THE PEN TO USE
C
IC = ABS(ICLR)
IC = MOD(IC,7)
WRITE (66,10) IC
10 FORMAT (' PU;SP',I1,';')
RETURN
END
C
C
C *************** PAUSE FOR PAPER CHANGE ********************
C
SUBROUTINE FIGURE (IFIG)
COMMON /PASS/ ITYP
DATA ICHK / 999 /
WRITE (66,40)
WRITE (*,*)
WRITE (*,10)
WRITE (*,20)
WRITE (*,30)
WRITE (*,*)
READ (*,50) IGET
IF (IGET.NE.ICHK) THEN
CALL PLOTS (ITYP)
ELSE
WRITE (*,60)
10 FORMAT (1X,' >>>>> CHANGE PAPER IF DESIRED <<<<<')
20 FORMAT (1X,' >>>>> ENTER:RETURN TO CONTINUE <<<<<')
30 FORMAT (1X,' >>>>> 999 TO STOP <<<<<')
40 FORMAT (1X,' SP0 ; ')
50 FORMAT (I3)
60 FORMAT (1X,' ---------- PLOTTING TERMINATED ----------')
STOP
ENDIF
RETURN
END
C
C
SUBROUTINE HPCIRC (X,Y,ICLR,RAD)
C
C PLOT AND FILL A CIRCLE ON THE HP7475A
C
CALL PLOT (X,Y,3)
CALL NEWPEN (ICLR)
IRAD = ABS(INT(RAD*1000.))
WRITE (66,10) IRAD
10 FORMAT (' FT;WG,',I5,',0,360;')
RETURN
END
|