page@swan.ulowell.edu (Bob Page) (11/03/88)
Submitted-by: strovink%galaxy-43@afit-ab.arpa (Mark A. Strovink) Posting-number: Volume 2, Issue 43 Archive-name: applications/matlab/src.3 # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # src-3 # This archive created: Wed Nov 2 16:20:21 1988 cat << \SHAR_EOF > src-3 44 MRAT = IDINT(STKR(L)) LRAT = IDINT(STKR(L-1)) TOP = TOP - 1 MSTK(TOP) = 0 GO TO 99 C C CHAR 50 K = IABS(IDINT(STKR(L))) IF (M*N.NE.1 .OR. K.GE.ALFL) CALL ERROR(36) IF (ERR .GT. 0) RETURN CH = ALFA(K+1) IF (STKR(L) .LT. 0.0D0) CH = ALFB(K+1) WRITE(WTE,51) CH 51 FORMAT(1X,'REPLACE CHARACTER ',A1) READ(RTE,52) CH 52 FORMAT(A1) IF (STKR(L) .GE. 0.0D0) ALFA(K+1) = CH IF (STKR(L) .LT. 0.0D0) ALFB(K+1) = CH MSTK(TOP) = 0 GO TO 99 C C DISP 60 WRITE(WTE,61) IF (WIO .NE. 0) WRITE(WIO,61) 61 FORMAT(1X,80A1) IF (RHS .EQ. 2) GO TO 65 MN = M*N TEXT = .TRUE. DO 62 I = 1, MN LS = L+I-1 CH = IDINT(STKR(LS)) TEXT = TEXT .AND. (CH.GE.0) .AND. (CH.LT.ALFL) TEXT = TEXT .AND. (DFLOAT(CH).EQ.STKR(LS)) 62 CONTINUE DO 64 I = 1, M DO 63 J = 1, N LS = L+I-1+(J-1)*M IF (STKR(LS) .EQ. 0.0D0) CH = BLANK IF (STKR(LS) .GT. 0.0D0) CH = PLUS IF (STKR(LS) .LT. 0.0D0) CH = MINUS IF (TEXT) CH = IDINT(STKR(LS)) BUF(J) = ALFA(CH+1) 63 CONTINUE WRITE(WTE,61) (BUF(J),J=1,N) IF (WIO .NE. 0) WRITE(WIO,61) (BUF(J),J=1,N) 64 CONTINUE MSTK(TOP) = 0 GO TO 99 C C BASE 65 IF (RHS .NE. 2) CALL ERROR(39) IF (STKR(L) .LE. 1.0D0) CALL ERROR(36) IF (ERR .GT. 0) RETURN B = STKR(L) L2 = L TOP = TOP-1 RHS = 1 L = LSTK(TOP) M = MSTK(TOP)*NSTK(TOP) EPS = STKR(VSIZE-4) DO 66 I = 1, M LS = L2+(I-1)*N LL = L+I-1 CALL BASE(STKR(LL),B,EPS,STKR(LS),N) 66 CONTINUE CALL RSET(M*N,0.0D0,STKI(L2),1) CALL WCOPY(M*N,STKR(L2),STKI(L2),1,STKR(L),STKI(L),1) MSTK(TOP) = N NSTK(TOP) = M CALL STACK1(QUOTE) IF (FIN .EQ. 6) GO TO 60 GO TO 99 C C LINES 70 LCT(2) = IDINT(STKR(L)) MSTK(TOP) = 0 GO TO 99 C C PLOT 80 IF (RHS .GE. 2) GO TO 82 N = M*N DO 81 I = 1, N LL = L+I-1 STKI(LL) = DFLOAT(I) 81 CONTINUE CALL PLOT(WTE,STKI(L),STKR(L),N,T,0,BUF) IF (WIO .NE. 0) CALL PLOT(WIO,STKI(L),STKR(L),N,T,0,BUF) MSTK(TOP) = 0 GO TO 99 82 IF (RHS .EQ. 2) K = 0 IF (RHS .EQ. 3) K = M*N IF (RHS .GT. 3) K = RHS - 2 TOP = TOP - (RHS - 1) N = MSTK(TOP)*NSTK(TOP) IF (MSTK(TOP+1)*NSTK(TOP+1) .NE. N) CALL ERROR(5) IF (ERR .GT. 0) RETURN LX = LSTK(TOP) LY = LSTK(TOP+1) IF (RHS .GT. 3) L = LSTK(TOP+2) CALL PLOT(WTE,STKR(LX),STKR(LY),N,STKR(L),K,BUF) IF (WIO .NE. 0) CALL PLOT(WIO,STKR(LX),STKR(LY),N,STKR(L),K,BUF) MSTK(TOP) = 0 GO TO 99 C C DEBUG 95 DDT = IDINT(STKR(L)) WRITE(WTE,96) DDT 96 FORMAT(1X,'DEBUG ',I4) MSTK(TOP) = 0 GO TO 99 C 99 RETURN END SUBROUTINE MATFN6 C C EVALUATE UTILITY FUNCTIONS C DOUBLE PRECISION STKR(5005),STKI(5005) INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2) COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN INTEGER SEMI,ID(4),UNIFOR(4),NORMAL(4),SEED(4) DOUBLE PRECISION EPS0,EPS,S,SR,SI,T DOUBLE PRECISION FLOP,URAND LOGICAL EQID DATA SEMI/39/ DATA UNIFOR/30,23,18,15/,NORMAL/23,24,27,22/,SEED/28,14,14,13/ C IF (DDT .EQ. 1) WRITE(WTE,100) FIN 100 FORMAT(1X,'MATFN6',I4) C FUNCTIONS/FIN C MAGI DIAG SUM PROD USER EYE RAND ONES CHOP SIZE KRON TRIL TRIU C 1 2 3 4 5 6 7 8 9 10 11-13 14 15 L = LSTK(TOP) M = MSTK(TOP) N = NSTK(TOP) GO TO (75,80,65,67,70,90,90,90,60,77,50,50,50,80,80),FIN C C KRONECKER PRODUCT 50 IF (RHS .NE. 2) CALL ERROR(39) IF (ERR .GT. 0) RETURN TOP = TOP - 1 L = LSTK(TOP) MA = MSTK(TOP) NA = NSTK(TOP) LA = L + MAX0(M*N*MA*NA,M*N+MA*NA) LB = LA + MA*NA ERR = LB + M*N - LSTK(BOT) IF (ERR .GT. 0) CALL ERROR(17) IF (ERR .GT. 0) RETURN C MOVE A AND B ABOVE RESULT CALL WCOPY(MA*NA+M*N,STKR(L),STKI(L),1,STKR(LA),STKI(LA),1) DO 54 JA = 1, NA DO 53 J = 1, N LJ = LB + (J-1)*M DO 52 IA = 1, MA C GET J-TH COLUMN OF B CALL WCOPY(M,STKR(LJ),STKI(LJ),1,STKR(L),STKI(L),1) C ADDRESS OF A(IA,JA) LS = LA + IA-1 + (JA-1)*MA DO 51 I = 1, M C A(IA,JA) OP B(I,J) IF (FIN .EQ. 11) CALL WMUL(STKR(LS),STKI(LS), $ STKR(L),STKI(L),STKR(L),STKI(L)) IF (FIN .EQ. 12) CALL WDIV(STKR(LS),STKI(LS), $ STKR(L),STKI(L),STKR(L),STKI(L)) IF (FIN .EQ. 13) CALL WDIV(STKR(L),STKI(L), $ STKR(LS),STKI(LS),STKR(L),STKI(L)) IF (ERR .GT. 0) RETURN L = L + 1 51 CONTINUE 52 CONTINUE 53 CONTINUE 54 CONTINUE MSTK(TOP) = M*MA NSTK(TOP) = N*NA GO TO 99 C C CHOP 60 EPS0 = 1.0D0 61 EPS0 = EPS0/2.0D0 T = FLOP(1.0D0 + EPS0) IF (T .GT. 1.0D0) GO TO 61 EPS0 = 2.0D0*EPS0 FLP(2) = IDINT(STKR(L)) IF (SYM .NE. SEMI) WRITE(WTE,62) FLP(2) 62 FORMAT(/1X,'CHOP ',I2,' PLACES.') EPS = 1.0D0 63 EPS = EPS/2.0D0 T = FLOP(1.0D0 + EPS) IF (T .GT. 1.0D0) GO TO 63 EPS = 2.0D0*EPS T = STKR(VSIZE-4) IF (T.LT.EPS .OR. T.EQ.EPS0) STKR(VSIZE-4) = EPS MSTK(TOP) = 0 GO TO 99 C C SUM 65 SR = 0.0D0 SI = 0.0D0 MN = M*N DO 66 I = 1, MN LS = L+I-1 SR = FLOP(SR+STKR(LS)) SI = FLOP(SI+STKI(LS)) 66 CONTINUE GO TO 69 C C PROD 67 SR = 1.0D0 SI = 0.0D0 MN = M*N DO 68 I = 1, MN LS = L+I-1 CALL WMUL(STKR(LS),STKI(LS),SR,SI,SR,SI) 68 CONTINUE 69 STKR(L) = SR STKI(L) = SI MSTK(TOP) = 1 NSTK(TOP) = 1 GO TO 99 C C USER 70 S = 0.0D0 T = 0.0D0 IF (RHS .LT. 2) GO TO 72 IF (RHS .LT. 3) GO TO 71 T = STKR(L) TOP = TOP-1 L = LSTK(TOP) M = MSTK(TOP) N = NSTK(TOP) 71 S = STKR(L) TOP = TOP-1 L = LSTK(TOP) M = MSTK(TOP) N = NSTK(TOP) 72 CALL USER(STKR(L),M,N,S,T) CALL RSET(M*N,0.0D0,STKI(L),1) MSTK(TOP) = M NSTK(TOP) = N GO TO 99 C C MAGIC 75 N = MAX0(IDINT(STKR(L)),0) IF (N .EQ. 2) N = 0 IF (N .GT. 0) CALL MAGIC(STKR(L),N,N) CALL RSET(N*N,0.0D0,STKI(L),1) MSTK(TOP) = N NSTK(TOP) = N GO TO 99 C C SIZE 77 STKR(L) = M STKR(L+1) = N STKI(L) = 0.0D0 STKI(L+1) = 0.0D0 MSTK(TOP) = 1 NSTK(TOP) = 2 IF (LHS .EQ. 1) GO TO 99 NSTK(TOP) = 1 TOP = TOP + 1 LSTK(TOP) = L+1 MSTK(TOP) = 1 NSTK(TOP) = 1 GO TO 99 C C DIAG, TRIU, TRIL 80 K = 0 IF (RHS .NE. 2) GO TO 81 K = IDINT(STKR(L)) TOP = TOP-1 L = LSTK(TOP) M = MSTK(TOP) N = NSTK(TOP) 81 IF (FIN .GE. 14) GO TO 85 IF (M .EQ. 1 .OR. N .EQ. 1) GO TO 83 IF (K.GE.0) MN=MIN0(M,N-K) IF (K.LT.0) MN=MIN0(M+K,N) MSTK(TOP) = MAX0(MN,0) NSTK(TOP) = 1 IF (MN .LE. 0) GO TO 99 DO 82 I = 1, MN IF (K.GE.0) LS = L+(I-1)+(I+K-1)*M IF (K.LT.0) LS = L+(I-K-1)+(I-1)*M LL = L+I-1 STKR(LL) = STKR(LS) STKI(LL) = STKI(LS) 82 CONTINUE GO TO 99 83 N = MAX0(M,N)+IABS(K) ERR = L+N*N - LSTK(BOT) IF (ERR .GT. 0) CALL ERROR(17) IF (ERR .GT. 0) RETURN MSTK(TOP) = N NSTK(TOP) = N DO 84 JB = 1, N DO 84 IB = 1, N J = N+1-JB I = N+1-IB SR = 0.0D0 SI = 0.0D0 IF (K.GE.0) LS = L+I-1 IF (K.LT.0) LS = L+J-1 LL = L+I-1+(J-1)*N IF (J-I .EQ. K) SR = STKR(LS) IF (J-I .EQ. K) SI = STKI(LS) STKR(LL) = SR STKI(LL) = SI 84 CONTINUE GO TO 99 C C TRIL, TRIU 85 DO 87 J = 1, N LD = L + J - K - 1 + (J-1)*M IF (FIN .EQ. 14) LL = J - K - 1 IF (FIN .EQ. 14) LS = LD - LL IF (FIN .EQ. 15) LL = M - J + K IF (FIN .EQ. 15) LS = LD + 1 IF (LL .GT. 0) CALL WSET(LL,0.0D0,0.0D0,STKR(LS),STKI(LS),1) 87 CONTINUE GO TO 99 C C EYE, RAND, ONES 90 IF (M.GT.1 .OR. RHS.EQ.0) GO TO 94 IF (RHS .NE. 2) GO TO 91 NN = IDINT(STKR(L)) TOP = TOP-1 L = LSTK(TOP) N = NSTK(TOP) 91 IF (FIN.NE.7 .OR. N.LT.4) GO TO 93 DO 92 I = 1, 4 LS = L+I-1 ID(I) = IDINT(STKR(LS)) 92 CONTINUE IF (EQID(ID,UNIFOR).OR.EQID(ID,NORMAL)) GO TO 97 IF (EQID(ID,SEED)) GO TO 98 93 IF (N .GT. 1) GO TO 94 M = MAX0(IDINT(STKR(L)),0) IF (RHS .EQ. 2) N = MAX0(NN,0) IF (RHS .NE. 2) N = M ERR = L+M*N - LSTK(BOT) IF (ERR .GT. 0) CALL ERROR(17) IF (ERR .GT. 0) RETURN MSTK(TOP) = M NSTK(TOP) = N IF (M*N .EQ. 0) GO TO 99 94 DO 96 J = 1, N DO 96 I = 1, M LL = L+I-1+(J-1)*M STKR(LL) = 0.0D0 STKI(LL) = 0.0D0 IF (I.EQ.J .OR. FIN.EQ.8) STKR(LL) = 1.0D0 IF (FIN.EQ.7 .AND. RAN(2).EQ.0) STKR(LL) = FLOP(URAND(RAN(1))) IF (FIN.NE.7 .OR. RAN(2).EQ.0) GO TO 96 95 SR = 2.0D0*URAND(RAN(1))-1.0D0 SI = 2.0D0*URAND(RAN(1))-1.0D0 T = SR*SR + SI*SI IF (T .GT. 1.0D0) GO TO 95 STKR(LL) = FLOP(SR*DSQRT(-2.0D0*DLOG(T)/T)) 96 CONTINUE GO TO 99 C C SWITCH UNIFORM AND NORMAL 97 RAN(2) = ID(1) - UNIFOR(1) MSTK(TOP) = 0 GO TO 99 C C SEED 98 IF (RHS .EQ. 2) RAN(1) = NN STKR(L) = RAN(1) MSTK(TOP) = 1 IF (RHS .EQ. 2) MSTK(TOP) = 0 NSTK(TOP) = 1 GO TO 99 C 99 RETURN END SUBROUTINE MATLAB(INIT) C INIT = 0 FOR ORDINARY FIRST ENTRY C = POSITIVE FOR SUBSEQUENT ENTRIES C = NEGATIVE FOR SILENT INITIALIZATION (SEE MATZ) C DOUBLE PRECISION STKR(5005),STKI(5005) INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP INTEGER ALFA(52),ALFB(52),ALFL,CASE INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2) COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP COMMON /ALFS/ ALFA,ALFB,ALFL,CASE COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN C DOUBLE PRECISION S,T INTEGER EPS(4),FLOPS(4),EYE(4),RAND(4) C C CHARACTER SET C 0 10 20 30 40 50 C C 0 0 A K U COLON : LESS < C 1 1 B L V PLUS + GREAT > C 2 2 C M W MINUS - C 3 3 D N X STAR * C 4 4 E O Y SLASH / C 5 5 F P Z BSLASH \ C 6 6 G Q BLANK EQUAL = C 7 7 H R LPAREN ( DOT . C 8 8 I S RPAREN ) COMMA , C 9 9 J T SEMI ; QUOTE ' C INTEGER ALPHA(52),ALPHB(52) DATA ALPHA /1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9, $ 1HA,1HB,1HC,1HD,1HE,1HF,1HG,1HH,1HI,1HJ, $ 1HK,1HL,1HM,1HN,1HO,1HP,1HQ,1HR,1HS,1HT, $ 1HU,1HV,1HW,1HX,1HY,1HZ,1H ,1H(,1H),1H;, $ 1H:,1H+,1H-,1H*,1H/,1H\,1H=,1H.,1H,,1H', $ 1H<,1H>/ C C ALTERNATE CHARACTER SET C DATA ALPHB /1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9, $ 1Ha,1Hb,1Hc,1Hd,1He,1Hf,1Hg,1Hh,1Hi,1Hj, $ 1Hk,1Hl,1Hm,1Hn,1Ho,1Hp,1Hq,1Hr,1Hs,1Ht, $ 1Hu,1Hv,1Hw,1Hx,1Hy,1Hz,1H ,1H(,1H),1H;, $ 1H|,1H+,1H-,1H*,1H/,1H$,1H=,1H.,1H,,1H", $ 1H[,1H]/ C DATA EPS/14,25,28,36/,FLOPS/15,21,24,25/ DATA EYE/14,34,14,36/,RAND/27,10,23,13/ C IF (INIT .GT. 0) GO TO 90 C C RTE = UNIT NUMBER FOR TERMINAL INPUT RTE = 9 CALL FILES(RTE,BUF) RIO = RTE C C WTE = UNIT NUMBER FOR TERMINAL OUTPUT WTE = 9 CALL FILES(WTE,BUF) WIO = 0 C IF (INIT .GE. 0) WRITE(WTE,100) 100 FORMAT(//1X,' < M A T L A B >' $ /1X,' Version of 05/25/82') C C HIO = UNIT NUMBER FOR HELP FILE HIO = 11 CALL FILES(HIO,BUF) C C RANDOM NUMBER SEED RAN(1) = 0 C C INITIAL LINE LIMIT LCT(2) = 25 C ALFL = 52 CASE = 0 C CASE = 1 for file names in lower case DO 20 I = 1, ALFL ALFA(I) = ALPHA(I) ALFB(I) = ALPHB(I) 20 CONTINUE C VSIZE = 5005 LSIZE = 48 PSIZE = 32 BOT = LSIZE-3 CALL WSET(5,0.0D0,0.0D0,STKR(VSIZE-4),STKI(VSIZE-4),1) CALL PUTID(IDSTK(1,LSIZE-3),EPS) LSTK(LSIZE-3) = VSIZE-4 MSTK(LSIZE-3) = 1 NSTK(LSIZE-3) = 1 S = 1.0D0 30 S = S/2.0D0 T = 1.0D0 + S IF (T .GT. 1.0D0) GO TO 30 STKR(VSIZE-4) = 2.0D0*S CALL PUTID(IDSTK(1,LSIZE-2),FLOPS) LSTK(LSIZE-2) = VSIZE-3 MSTK(LSIZE-2) = 1 NSTK(LSIZE-2) = 2 CALL PUTID(IDSTK(1,LSIZE-1), EYE) LSTK(LSIZE-1) = VSIZE-1 MSTK(LSIZE-1) = -1 NSTK(LSIZE-1) = -1 STKR(VSIZE-1) = 1.0D0 CALL PUTID(IDSTK(1,LSIZE), RAND) LSTK(LSIZE) = VSIZE MSTK(LSIZE) = 1 NSTK(LSIZE) = 1 FMT = 1 FLP(1) = 0 FLP(2) = 0 DDT = 0 RAN(2) = 0 PTZ = 0 PT = PTZ ERR = 0 IF (INIT .LT. 0) RETURN C 90 CALL PARSE IF (FUN .EQ. 1) CALL MATFN1 IF (FUN .EQ. 2) CALL MATFN2 IF (FUN .EQ. 3) CALL MATFN3 IF (FUN .EQ. 4) CALL MATFN4 IF (FUN .EQ. 5) CALL MATFN5 IF (FUN .EQ. 6) CALL MATFN6 IF (FUN .EQ. 21) CALL MATFN1 IF (FUN .NE. 99) GO TO 90 RETURN END SUBROUTINE PARSE DOUBLE PRECISION STKR(5005),STKI(5005) INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2) COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN LOGICAL EQID INTEGER SEMI,EQUAL,EOL,ID(4),EXCNT,LPAREN,RPAREN,COLON,PTS,ALFL INTEGER BLANK,COMMA,LESS,GREAT,NAME,ANS(4),ENND(4),ELSE(4),P,R DATA BLANK/36/,SEMI/39/,EQUAL/46/,EOL/99/,COMMA/48/,COLON/40/ DATA LPAREN/37/,RPAREN/38/,LESS/50/,GREAT/51/,NAME/1/,ALFL/52/ DATA ANS/10,23,28,36/,ENND/14,23,13,36/,ELSE/14,21,28,14/ C 01 R = 0 IF (ERR .GT. 0) PTZ = 0 IF (ERR.LE.0 .AND. PT.GT.PTZ) R = RSTK(PT) IF (DDT .EQ. 1) WRITE(WTE,100) PT,R,PTZ,ERR 100 FORMAT(1X,'PARSE ',4I4) IF (R.EQ.15) GO TO 93 IF (R.EQ.16 .OR. R.EQ.17) GO TO 94 SYM = EOL TOP = 0 IF (RIO .NE. RTE) CALL FILES(-1*RIO,BUF) RIO = RTE LCT(3) = 0 LCT(4) = 2 LPT(1) = 1 10 IF (SYM.EQ.EOL .AND. MOD(LCT(4)/2,2).EQ.1) CALL PROMPT(LCT(4)/4) IF (SYM .EQ. EOL) CALL GETLIN ERR = 0 PT = PTZ 15 EXCNT = 0 IF (DDT .EQ. 1) WRITE(WTE,115) PT,TOP 115 FORMAT(1X,'STATE ',2I4) LHS = 1 CALL PUTID(ID,ANS) CALL GETSYM IF (SYM.EQ.COLON .AND. CHAR.EQ.EOL) DDT = 1-DDT IF (SYM .EQ. COLON) CALL GETSYM IF (SYM.EQ.SEMI .OR. SYM.EQ.COMMA .OR. SYM.EQ.EOL) GO TO 80 IF (SYM .EQ. NAME) GO TO 20 IF (SYM .EQ. LESS) GO TO 40 IF (SYM .EQ. GREAT) GO TO 45 GO TO 50 C C LHS BEGINS WITH NAME 20 CALL COMAND(SYN) IF (ERR .GT. 0) GO TO 01 IF (FUN .EQ. 99) GO TO 95 IF (FIN .EQ. -15) GO TO 80 IF (FIN .LT. 0) GO TO 91 IF (FIN .GT. 0) GO TO 70 C IF NAME IS A FUNCTION, MUST BE RHS RHS = 0 CALL FUNS(SYN) IF (FIN .NE. 0) GO TO 50 C PEEK ONE CHARACTER AHEAD IF (CHAR.EQ.SEMI .OR. CHAR.EQ.COMMA .OR. CHAR.EQ.EOL) $ CALL PUTID(ID,SYN) IF (CHAR .EQ. EQUAL) GO TO 25 IF (CHAR .EQ. LPAREN) GO TO 30 GO TO 50 C C LHS IS SIMPLE VARIABLE 25 CALL PUTID(ID,SYN) CALL GETSYM CALL GETSYM GO TO 50 C C LHS IS NAME(...) 30 LPT(5) = LPT(4) CALL PUTID(ID,SYN) CALL GETSYM 32 CALL GETSYM EXCNT = EXCNT+1 PT = PT+1 CALL PUTID(IDS(1,PT), ID) PSTK(PT) = EXCNT RSTK(PT) = 1 C *CALL* EXPR GO TO 92 35 CALL PUTID(ID,IDS(1,PT)) EXCNT = PSTK(PT) PT = PT-1 IF (SYM .EQ. COMMA) GO TO 32 IF (SYM .NE. RPAREN) CALL ERROR(3) IF (ERR .GT. 0) GO TO 01 IF (ERR .GT. 0) RETURN IF (SYM .EQ. RPAREN) CALL GETSYM IF (SYM .EQ. EQUAL) GO TO 50 C LHS IS REALLY RHS, FORGET SCAN JUST DONE TOP = TOP - EXCNT LPT(4) = LPT(5) CHAR = LPAREN SYM = NAME CALL PUTID(SYN,ID) CALL PUTID(ID,ANS) EXCNT = 0 GO TO 50 C C MULTIPLE LHS 40 LPT(5) = LPT(4) PTS = PT CALL GETSYM 41 IF (SYM .NE. NAME) GO TO 43 CALL PUTID(ID,SYN) CALL GETSYM IF (SYM .EQ. GREAT) GO TO 42 IF (SYM .EQ. COMMA) CALL GETSYM PT = PT+1 LHS = LHS+1 PSTK(PT) = 0 CALL PUTID(IDS(1,PT),ID) GO TO 41 42 CALL GETSYM IF (SYM .EQ. EQUAL) GO TO 50 43 LPT(4) = LPT(5) PT = PTS LHS = 1 SYM = LESS CHAR = LPT(4)-1 CHAR = LIN(CHAR) CALL PUTID(ID,ANS) GO TO 50 C C MACRO STRING 45 CALL GETSYM IF (DDT .EQ. 1) WRITE(WTE,145) PT,TOP 145 FORMAT(1X,'MACRO ',2I4) IF (SYM.EQ.LESS .AND. CHAR.EQ.EOL) CALL ERROR(28) IF (ERR .GT. 0) GO TO 01 PT = PT+1 RSTK(PT) = 20 C *CALL* EXPR GO TO 92 46 PT = PT-1 IF (SYM.NE.LESS .AND. SYM.NE.EOL) CALL ERROR(37) IF (ERR .GT. 0) GO TO 01 IF (SYM .EQ. LESS) CALL GETSYM K = LPT(6) LIN(K+1) = LPT(1) LIN(K+2) = LPT(2) LIN(K+3) = LPT(6) LPT(1) = K + 4 C TRANSFER STACK TO INPUT LINE K = LPT(1) L = LSTK(TOP) N = MSTK(TOP)*NSTK(TOP) DO 48 J = 1, N LS = L + J-1 LIN(K) = IDINT(STKR(LS)) IF (LIN(K).LT.0 .OR. LIN(K).GE.ALFL) CALL ERROR(37) IF (ERR .GT. 0) RETURN IF (K.LT.1024) K = K+1 IF (K.EQ.1024) WRITE(WTE,47) K 47 FORMAT(1X,'INPUT BUFFER LIMIT IS ',I4,' CHARACTERS.') 48 CONTINUE TOP = TOP-1 LIN(K) = EOL LPT(6) = K LPT(4) = LPT(1) LPT(3) = 0 LPT(2) = 0 LCT(1) = 0 CHAR = BLANK PT = PT+1 PSTK(PT) = LPT(1) RSTK(PT) = 21 C *CALL* PARSE GO TO 15 49 PT = PT-1 IF (DDT .EQ. 1) WRITE(WTE,149) PT,TOP 149 FORMAT(1X,'MACEND',2I4) K = LPT(1) - 4 LPT(1) = LIN(K+1) LPT(4) = LIN(K+2) LPT(6) = LIN(K+3) CHAR = BLANK CALL GETSYM GO TO 80 C C LHS FINISHED, START RHS 50 IF (SYM .EQ. EQUAL) CALL GETSYM PT = PT+1 CALL PUTID(IDS(1,PT),ID) PSTK(PT) = EXCNT RSTK(PT) = 2 C *CALL* EXPR GO TO 92 55 IF (SYM.EQ.SEMI .OR. SYM.EQ.COMMA .OR. SYM.EQ.EOL) GO TO 60 IF (SYM.EQ.NAME .AND. EQID(SYN,ELSE)) GO TO 60 IF (SYM.EQ.NAME .AND. EQID(SYN,ENND)) GO TO 60 CALL ERROR(40) IF (ERR .GT. 0) GO TO 01 C C STORE RESULTS 60 RHS = PSTK(PT) CALL STACKP(IDS(1,PT)) IF (ERR .GT. 0) GO TO 01 PT = PT-1 LHS = LHS-1 IF (LHS .GT. 0) GO TO 60 GO TO 70 C C UPDATE AND POSSIBLY PRINT OPERATION COUNTS 70 K = FLP(1) IF (K .NE. 0) STKR(VSIZE-3) = DFLOAT(K) STKR(VSIZE-2) = STKR(VSIZE-2) + DFLOAT(K) FLP(1) = 0 IF (.NOT.(CHAR.EQ.COMMA .OR. (SYM.EQ.COMMA .AND. CHAR.EQ.EOL))) $ GO TO 80 CALL GETSYM I5 = 10**5 LUNIT = WTE 71 IF (K .EQ. 0) WRITE(LUNIT,171) 171 FORMAT(/1X,' no flops') IF (K .EQ. 1) WRITE(LUNIT,172) 172 FORMAT(/1X,' 1 flop') IF (1.LT.K .AND. K.LT.100000) WRITE(LUNIT,173) K 173 FORMAT(/1X,I5,' flops') IF (100000 .LE. K) WRITE(LUNIT,174) K 174 FORMAT(/1X,I9,' flops') IF (LUNIT.EQ.WIO .OR. WIO.EQ.0) GO TO 80 LUNIT = WIO GO TO 71 C C FINISH STATEMENT 80 FIN = 0 P = 0 R = 0 IF (PT .GT. 0) P = PSTK(PT) IF (PT .GT. 0) R = RSTK(PT) IF (DDT .EQ. 1) WRITE(WTE,180) PT,PTZ,P,R,LPT(1) 180 FORMAT(1X,'FINISH',5I4) IF (SYM.EQ.COMMA .OR. SYM.EQ.SEMI) GO TO 15 IF (R.EQ.21 .AND. P.EQ.LPT(1)) GO TO 49 IF (PT .GT. PTZ) GO TO 91 GO TO 10 C C SIMULATE RECURSION 91 CALL CLAUSE IF (ERR .GT. 0) GO TO 01 IF (PT .LE. PTZ) GO TO 15 R = RSTK(PT) IF (R .EQ. 21) GO TO 49 GO TO (99,99,92,92,92,99,99,99,99,99,99,99,15,15,99,99,99,99,99),R C 92 CALL EXPR IF (ERR .GT. 0) GO TO 01 R = RSTK(PT) GO TO (35,55,91,91,91,93,93,99,99,94,94,99,99,99,99,99,99,94,94, $ 46),R C 93 CALL TERM IF (ERR .GT. 0) GO TO 01 R = RSTK(PT) GO TO (99,99,99,99,99,92,92,94,94,99,99,99,99,99,95,99,99,99,99),R C 94 CALL FACTOR IF (ERR .GT. 0) GO TO 01 R = RSTK(PT) GO TO (99,99,99,99,99,99,99,93,93,92,92,94,99,99,99,95,95,92,92),R C C CALL MATFNS BY RETURNING TO MATLAB 95 IF (FIN.GT.0 .AND. MSTK(TOP).LT.0) CALL ERROR(14) IF (ERR .GT. 0) GO TO 01 RETURN C 99 CALL ERROR(22) GO TO 01 END SUBROUTINE PLOT(LUNIT,X,Y,N,P,K,BUF) DOUBLE PRECISION X(N),Y(N),P(1) INTEGER BUF(79) C C PLOT X VS. Y ON LUNIT C IF K IS NONZERO, THEN P(1),...,P(K) ARE EXTRA PARAMETERS C BUF IS WORK SPACE C DOUBLE PRECISION XMIN,YMIN,XMAX,YMAX,DY,DX,Y1,Y0 INTEGER AST,BLANK,H,W DATA AST/1H*/,BLANK/1H /,H/20/,W/79/ C C H = HEIGHT, W = WIDTH C IF (K .GT. 0) WRITE(LUNIT,01) (P(I), I=1,K) 01 FORMAT('Extra parameters',10f5.1) XMIN = X(1) XMAX = X(1) YMIN = Y(1) YMAX = Y(1) DO 10 I = 1, N XMIN = DMIN1(XMIN,X(I)) XMAX = DMAX1(XMAX,X(I)) YMIN = DMIN1(YMIN,Y(I)) YMAX = DMAX1(YMAX,Y(I)) 10 CONTINUE DX = XMAX - XMIN IF (DX .EQ. 0.0D0) DX = 1.0D0 DY = YMAX - YMIN WRITE(LUNIT,35) DO 40 L = 1, H DO 20 J = 1, W BUF(J) = BLANK 20 CONTINUE Y1 = YMIN + (H-L+1)*DY/H Y0 = YMIN + (H-L)*DY/H JMAX = 1 DO 30 I = 1, N IF (Y(I) .GT. Y1) GO TO 30 IF (L.NE.H .AND. Y(I).LE.Y0) GO TO 30 J = 1 + (W-1)*(X(I) - XMIN)/DX BUF(J) = AST JMAX = MAX0(JMAX,J) 30 CONTINUE WRITE(LUNIT,35) (BUF(J),J=1,JMAX) 35 FORMAT(79A1) 40 CONTINUE RETURN END SUBROUTINE PRINT(ID,K) C PRIMARY OUTPUT ROUTINE INTEGER ID(4),K DOUBLE PRECISION STKR(5005),STKI(5005) INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP INTEGER ALFA(52),ALFB(52),ALFL,CASE INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2) COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP COMMON /ALFS/ ALFA,ALFB,ALFL,CASE COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN DOUBLE PRECISION S,TR,TI,PR(12),PI(12),ROUND INTEGER FNO(11),FNL(11),SIG(12),PLUS,MINUS,BLANK,TYP,F DATA PLUS/41/,MINUS/42/,BLANK/36/ C FORMAT NUMBERS AND LENGTHS DATA FNO /11,12,21,22,23,24,31,32,33,34,-1/ DATA FNL /12, 6, 8, 4, 6, 3, 4, 2, 3, 1, 1/ C FMT 1 2 3 4 5 C SHORT LONG SHORT E LONG E Z C TYP 1 2 3 C INTEGER REAL COMPLEX IF (LCT(1) .LT. 0) GO TO 99 L = LSTK(K) M = MSTK(K) N = NSTK(K) MN = M*N TYP = 1 S = 0.0D0 DO 10 I = 1, MN LS = L+I-1 TR = STKR(LS) TI = STKI(LS) S = DMAX1(S,DABS(TR),DABS(TI)) IF (ROUND(TR) .NE. TR) TYP = MAX0(2,TYP) IF (TI .NE. 0.0D0) TYP = 3 10 CONTINUE IF (S .NE. 0.0D0) S = DLOG10(S) KS = IDINT(S) IF (-2 .LE. KS .AND. KS .LE. 1) KS = 0 IF (KS .EQ. 2 .AND. FMT .EQ. 1 .AND. TYP .EQ. 2) KS = 0 IF (TYP .EQ. 1 .AND. KS .LE. 2) F = 1 IF (TYP .EQ. 1 .AND. KS .GT. 2) F = 2 IF (TYP .EQ. 1 .AND. KS .GT. 9) TYP = 2 IF (TYP .EQ. 2) F = FMT + 2 IF (TYP .EQ. 3) F = FMT + 6 IF (MN.EQ.1 .AND. KS.NE.0 .AND. FMT.LT.3 .AND. TYP.NE.1) F = F+2 IF (FMT .EQ. 5) F = 11 JINC = FNL(F) F = FNO(F) S = 1.0D0 IF (F.EQ.21 .OR. F.EQ.22 .OR. F.EQ.31 .OR. F.EQ.32) S = 10.0D0**KS LS = ((N-1)/JINC+1)*M + 2 IF (LCT(1) + LS .LE. LCT(2)) GO TO 20 LCT(1) = 0 WRITE(WTE,43) LS READ(RTE,44,END=19) LS CDC.. IF (EOF(RTE).NE.0) GO TO 19 IF (LS .EQ. ALFA(BLANK+1)) GO TO 20 LCT(1) = -1 GO TO 99 19 CALL FILES(-1*RTE,BUF) 20 CONTINUE WRITE(WTE,44) IF (WIO .NE. 0) WRITE(WIO,44) CALL PRNTID(ID,-1) LCT(1) = LCT(1)+2 LUNIT = WTE 50 IF (S .NE. 1.0D0) WRITE(LUNIT,41) S DO 80 J1 = 1, N, JINC J2 = MIN0(N, J1+JINC-1) WRITE(LUNIT,44) IF (N .GT. JINC) WRITE(LUNIT,42) J1,J2 DO 70 I = 1, M JM = J2-J1+1 DO 60 J = 1, JM LS = L+I-1+(J+J1-2)*M PR(J) = STKR(LS)/S PI(J) = DABS(STKI(LS)/S) SIG(J) = ALFA(PLUS+1) IF (STKI(LS) .LT. 0.0D0) SIG(J) = ALFA(MINUS+1) 60 CONTINUE IF (F .EQ. 11) WRITE(LUNIT,11)(PR(J),J=1,JM) IF (F .EQ. 12) WRITE(LUNIT,12)(PR(J),J=1,JM) IF (F .EQ. 21) WRITE(LUNIT,21)(PR(J),J=1,JM) IF (F .EQ. 22) WRITE(LUNIT,22)(PR(J),J=1,JM) IF (F .EQ. 23) WRITE(LUNIT,23)(PR(J),J=1,JM) IF (F .EQ. 24) WRITE(LUNIT,24)(PR(J),J=1,JM) IF (F .EQ. 31) WRITE(LUNIT,31)(PR(J),SIG(J),PI(J),J=1,JM) IF (F .EQ. 32) WRITE(LUNIT,32)(PR(J),SIG(J),PI(J),J=1,JM) IF (F .EQ. 33) WRITE(LUNIT,33)(PR(J),SIG(J),PI(J),J=1,JM) IF (F .EQ. 34) WRITE(LUNIT,34)(PR(J),SIG(J),PI(J),J=1,JM) IF (F .EQ. -1) CALL FORMZ(LUNIT,STKR(LS),STKI(LS)) LCT(1) = LCT(1)+1 70 CONTINUE 80 CONTINUE IF (LUNIT.EQ.WIO .OR. WIO.EQ.0) GO TO 99 LUNIT = WIO GO TO 50 99 RETURN C 11 FORMAT(1X,12F6.0) 12 FORMAT(1X,6F12.0) 21 FORMAT(1X,F9.4,7F10.4) 22 FORMAT(1X,F19.15,3F20.15) 23 FORMAT(1X,1P6D13.4) 24 FORMAT(1X,1P3D24.15) 31 FORMAT(1X,4(F9.4,' ',A1,F7.4,'i')) 32 FORMAT(1X,F19.15,A1,F18.15,'i',F20.15,A1,F18.15,'i') 33 FORMAT(1X,3(1PD13.4,' ',A1,1PD10.4,'i')) 34 FORMAT(1X,1PD24.15,' ',A1,1PD21.15,'i') 41 FORMAT(/1X,' ',1PD9.1,2H *) 42 FORMAT(1X,' COLUMNS',I3,' THRU',I3) 43 FORMAT(/1X,'AT LEAST ',I5,' MORE LINES.', $ ' ENTER BLANK LINE TO CONTINUE OUTPUT.') 44 FORMAT(A1) C END SUBROUTINE PRNTID(ID,ARGCNT) C PRINT VARIABLE NAMES INTEGER ID(4,1),ARGCNT INTEGER ALFA(52),ALFB(52),ALFL,CASE INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2) COMMON /ALFS/ ALFA,ALFB,ALFL,CASE COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN INTEGER EQUAL DATA EQUAL/46/ J1 = 1 10 J2 = MIN0(J1+7,IABS(ARGCNT)) L = 0 DO 15 J = J1,J2 DO 15 I = 1, 4 K = ID(I,J)+1 L = L+1 BUF(L) = ALFA(K) 15 CONTINUE IF (ARGCNT .EQ. -1) L=L+1 IF (ARGCNT .EQ. -1) BUF(L) = ALFA(EQUAL+1) WRITE(WTE,20) (BUF(I),I=1,L) IF (WIO .NE. 0) WRITE(WIO,20) (BUF(I),I=1,L) 20 FORMAT(1X,8(4A1,2H )) J1 = J1+8 IF (J1 .LE. IABS(ARGCNT)) GO TO 10 RETURN END SUBROUTINE PROMPT(PAUSE) INTEGER PAUSE C C ISSUE MATLAB PROMPT WITH OPTIONAL PAUSE C INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE WRITE(WTE,10) IF (WIO .NE. 0) WRITE(WIO,10) 10 FORMAT(/1X,'<>',$) IF (PAUSE .EQ. 1) READ(RTE,20) DUMMY 20 FORMAT(A1) RETURN END DOUBLE PRECISION FUNCTION PYTHAG(A,B) DOUBLE PRECISION A,B INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE DOUBLE PRECISION P,Q,R,S,T P = DMAX1(DABS(A),DABS(B)) Q = DMIN1(DABS(A),DABS(B)) IF (Q .EQ. 0.0D0) GO TO 20 IF (DDT .EQ. 25) WRITE(WTE,1) IF (DDT .EQ. 25) WRITE(WTE,2) P,Q 1 FORMAT(1X,'PYTHAG',1P2D23.15) 2 FORMAT(1X,1P2D23.15) 10 R = (Q/P)**2 T = 4.0D0 + R IF (T .EQ. 4.0D0) GO TO 20 S = R/T P = P + 2.0D0*P*S Q = Q*S IF (DDT .EQ. 25) WRITE(WTE,2) P,Q GO TO 10 20 PYTHAG = P RETURN END SUBROUTINE RAT(X,LEN,MAXD,A,B,D) INTEGER LEN,MAXD DOUBLE PRECISION X,A,B,D(LEN) C C A/B = CONTINUED FRACTION APPROXIMATION TO X C USING LEN TERMS EACH LESS THAN MAXD C INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE DOUBLE PRECISION S,T,Z,ROUND Z = X DO 10 I = 1, LEN K = I D(K) = ROUND(Z) Z = Z - D(K) IF (DABS(Z)*DFLOAT(MAXD) .LE. 1.0D0) GO TO 20 Z = 1.0D0/Z 10 CONTINUE 20 T = D(K) S = 1.0D0 IF (K .LT. 2) GO TO 40 DO 30 IB = 2, K I = K+1-IB Z = T T = D(I)*T + S S = Z 30 CONTINUE 40 IF (S .LT. 0.0D0) T = -T IF (S .LT. 0.0D0) S = -S IF (DDT .EQ. 27) WRITE(WTE,50) X,T,S,(D(I),I=1,K) 50 FORMAT(/1X,1PD23.15,0PF8.0,' /',F8.0,4X,6F5.0/(1X,45X,6F5.0)) A = T B = S RETURN END SUBROUTINE SAVLOD(LUNIT,ID,M,N,IMG,JOB,XREAL,XIMAG) INTEGER LUNIT,ID(4),M,N,IMG,JOB DOUBLE PRECISION XREAL(1),XIMAG(1) C C IMPLEMENT SAVE AND LOAD C LUNIT = LOGICAL UNIT NUMBER C ID = NAME, FORMAT 4A1 C M, N = DIMENSIONS C IMG = NONZERO IF XIMAG IS NONZERO C JOB = 0 FOR SAVE C = SPACE AVAILABLE FOR LOAD C XREAL, XIMAG = REAL AND OPTIONAL IMAGINARY PARTS C C SYSTEM DEPENDENT FORMATS 101 FORMAT(4A1,3I4) 102 FORMAT(4Z18) C IF (JOB .GT. 0) GO TO 20 C C SAVE 10 WRITE(LUNIT,101) ID,M,N,IMG DO 15 J = 1, N K = (J-1)*M+1 L = J*M WRITE(LUNIT,102) (XREAL(I),I=K,L) IF (IMG .NE. 0) WRITE(LUNIT,102) (XIMAG(I),I=K,L) 15 CONTINUE RETURN C C LOAD 20 READ(LUNIT,101,END=30) ID,M,N,IMG IF (M*N .GT. JOB) GO TO 30 DO 25 J = 1, N K = (J-1)*M+1 L = J*M READ(LUNIT,102,END=30) (XREAL(I),I=K,L) IF (IMG .NE. 0) READ(LUNIT,102,END=30) (XIMAG(I),I=K,L) 25 CONTINUE RETURN C C END OF FILE 30 M = 0 N = 0 RETURN END SUBROUTINE STACK1(OP) INTEGER OP C C UNARY OPERATIONS C DOUBLE PRECISION STKR(5005),STKI(5005) INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2) COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN INTEGER QUOTE DATA QUOTE/49/ IF (DDT .EQ. 1) WRITE(WTE,100) OP 100 FORMAT(1X,'STACK1',I4) L = LSTK(TOP) M = MSTK(TOP) N = NSTK(TOP) MN = M*N IF (MN .EQ. 0) GO TO 99 IF (OP .EQ. QUOTE) GO TO 30 C C UNARY MINUS CALL WRSCAL(MN,-1.0D0,STKR(L),STKI(L),1) GO TO 99 C C TRANSPOSE 30 LL = L + MN ERR = LL+MN - LSTK(BOT) IF (ERR .GT. 0) CALL ERROR(17) IF (ERR .GT. 0) RETURN CALL WCOPY(MN,STKR(L),STKI(L),1,STKR(LL),STKI(LL),1) M = NSTK(TOP) N = MSTK(TOP) MSTK(TOP) = M NSTK(TOP) = N DO 50 I = 1, M DO 50 J = 1, N LS = L+MN+(J-1)+(I-1)*N LL = L+(I-1)+(J-1)*M STKR(LL) = STKR(LS) STKI(LL) = -STKI(LS) 50 CONTINUE GO TO 99 99 RETURN END SUBROUTINE STACK2(OP) INTEGER OP C C BINARY AND TERNARY OPERATIONS C DOUBLE PRECISION STKR(5005),STKI(5005) INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2) COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN DOUBLE PRECISION WDOTUR,WDOTUI DOUBLE PRECISION SR,SI,E1,ST,E2,FLOP INTEGER PLUS,MINUS,STAR,DSTAR,SLASH,BSLASH,DOT,COLON DATA PLUS/41/,MINUS/42/,STAR/43/,DSTAR/54/,SLASH/44/ DATA BSLASH/45/,DOT/47/,COLON/40/ C IF (DDT .EQ. 1) WRITE(WTE,100) OP 100 FORMAT(1X,'STACK2',I4) L2 = LSTK(TOP) M2 = MSTK(TOP) N2 = NSTK(TOP) TOP = TOP-1 L = LSTK(TOP) M = MSTK(TOP) N = NSTK(TOP) FUN = 0 IF (OP .EQ. PLUS) GO TO 01 IF (OP .EQ. MINUS) GO TO 03 IF (OP .EQ. STAR) GO TO 05 IF (OP .EQ. DSTAR) GO TO 30 IF (OP .EQ. SLASH) GO TO 20 IF (OP .EQ. BSLASH) GO TO 25 IF (OP .EQ. COLON) GO TO 60 IF (OP .GT. 2*DOT) GO TO 80 SHAR_EOF # End of shell archive exit 0 -- Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page Have five nice days.