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 44 Archive-name: applications/matlab/src.4 # 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-4 # This archive created: Wed Nov 2 16:20:28 1988 cat << \SHAR_EOF > src-4 IF (OP .GT. DOT) GO TO 70 C C ADDITION 01 IF (M .LT. 0) GO TO 50 IF (M2 .LT. 0) GO TO 52 IF (M .NE. M2) CALL ERROR(8) IF (ERR .GT. 0) RETURN IF (N .NE. N2) CALL ERROR(8) IF (ERR .GT. 0) RETURN CALL WAXPY(M*N,1.0D0,0.0D0,STKR(L2),STKI(L2),1, $ STKR(L),STKI(L),1) GO TO 99 C C SUBTRACTION 03 IF (M .LT. 0) GO TO 54 IF (M2 .LT. 0) GO TO 56 IF (M .NE. M2) CALL ERROR(9) IF (ERR .GT. 0) RETURN IF (N .NE. N2) CALL ERROR(9) IF (ERR .GT. 0) RETURN CALL WAXPY(M*N,-1.0D0,0.0D0,STKR(L2),STKI(L2),1, $ STKR(L),STKI(L),1) GO TO 99 C C MULTIPLICATION 05 IF (M2*M2*N2 .EQ. 1) GO TO 10 IF (M*N .EQ. 1) GO TO 11 IF (M2*N2 .EQ. 1) GO TO 10 IF (N .NE. M2) CALL ERROR(10) IF (ERR .GT. 0) RETURN MN = M*N2 LL = L + MN ERR = LL+M*N+M2*N2 - LSTK(BOT) IF (ERR .GT. 0) CALL ERROR(17) IF (ERR .GT. 0) RETURN CALL WCOPY(M*N+M2*N2,STKR(L),STKI(L),-1,STKR(LL),STKI(LL),-1) DO 08 J = 1, N2 DO 08 I = 1, M K1 = L + MN + (I-1) K2 = L2 + MN + (J-1)*M2 K = L + (I-1) + (J-1)*M STKR(K) = WDOTUR(N,STKR(K1),STKI(K1),M,STKR(K2),STKI(K2),1) STKI(K) = WDOTUI(N,STKR(K1),STKI(K1),M,STKR(K2),STKI(K2),1) 08 CONTINUE NSTK(TOP) = N2 GO TO 99 C C MULTIPLICATION BY SCALAR 10 SR = STKR(L2) SI = STKI(L2) L1 = L GO TO 13 11 SR = STKR(L) SI = STKI(L) L1 = L+1 MSTK(TOP) = M2 NSTK(TOP) = N2 13 MN = MSTK(TOP)*NSTK(TOP) CALL WSCAL(MN,SR,SI,STKR(L1),STKI(L1),1) IF (L1.NE.L) $ CALL WCOPY(MN,STKR(L1),STKI(L1),1,STKR(L),STKI(L),1) GO TO 99 C C RIGHT DIVISION 20 IF (M2*N2 .EQ. 1) GO TO 21 IF (M2 .EQ. N2) FUN = 1 IF (M2 .NE. N2) FUN = 4 FIN = -1 RHS = 2 GO TO 99 21 SR = STKR(L2) SI = STKI(L2) MN = M*N DO 22 I = 1, MN LL = L+I-1 CALL WDIV(STKR(LL),STKI(LL),SR,SI,STKR(LL),STKI(LL)) IF (ERR .GT. 0) RETURN 22 CONTINUE GO TO 99 C C LEFT DIVISION 25 IF (M*N .EQ. 1) GO TO 26 IF (M .EQ. N) FUN = 1 IF (M .NE. N) FUN = 4 FIN = -2 RHS = 2 GO TO 99 26 SR = STKR(L) SI = STKI(L) MSTK(TOP) = M2 NSTK(TOP) = N2 MN = M2*N2 DO 27 I = 1, MN LL = L+I-1 CALL WDIV(STKR(LL+1),STKI(LL+1),SR,SI,STKR(LL),STKI(LL)) IF (ERR .GT. 0) RETURN 27 CONTINUE GO TO 99 C C POWER 30 IF (M2*N2 .NE. 1) CALL ERROR(30) IF (ERR .GT. 0) RETURN IF (M .NE. N) CALL ERROR(20) IF (ERR .GT. 0) RETURN NEXP = IDINT(STKR(L2)) IF (STKR(L2) .NE. DFLOAT(NEXP)) GO TO 39 IF (STKI(L2) .NE. 0.0D0) GO TO 39 IF (NEXP .LT. 2) GO TO 39 MN = M*N ERR = L2+MN+N - LSTK(BOT) IF (ERR .GT. 0) CALL ERROR(17) IF (ERR .GT. 0) RETURN CALL WCOPY(MN,STKR(L),STKI(L),1,STKR(L2),STKI(L2),1) L3 = L2+MN DO 36 KEXP = 2, NEXP DO 35 J = 1, N LS = L+(J-1)*N CALL WCOPY(N,STKR(LS),STKI(LS),1,STKR(L3),STKI(L3),1) DO 34 I = 1, N LS = L2+I-1 LL = L+I-1+(J-1)*N STKR(LL) = WDOTUR(N,STKR(LS),STKI(LS),N,STKR(L3),STKI(L3),1) STKI(LL) = WDOTUI(N,STKR(LS),STKI(LS),N,STKR(L3),STKI(L3),1) 34 CONTINUE 35 CONTINUE 36 CONTINUE GO TO 99 C C NONINTEGER OR NONPOSITIVE POWER, USE EIGENVECTORS 39 FUN = 2 FIN = 0 GO TO 99 C C ADD OR SUBTRACT SCALAR 50 IF (M2 .NE. N2) CALL ERROR(8) IF (ERR .GT. 0) RETURN M = M2 N = N2 MSTK(TOP) = M NSTK(TOP) = N SR = STKR(L) SI = STKI(L) CALL WCOPY(M*N,STKR(L+1),STKI(L+1),1,STKR(L),STKI(L),1) GO TO 58 52 IF (M .NE. N) CALL ERROR(8) IF (ERR .GT. 0) RETURN SR = STKR(L2) SI = STKI(L2) GO TO 58 54 IF (M2 .NE. N2) CALL ERROR(9) IF (ERR .GT. 0) RETURN M = M2 N = N2 MSTK(TOP) = M NSTK(TOP) = N SR = STKR(L) SI = STKI(L) CALL WCOPY(M*N,STKR(L+1),STKI(L+1),1,STKR(L),STKI(L),1) CALL WRSCAL(M*N,-1.0D0,STKR(L),STKI(L),1) GO TO 58 56 IF (M .NE. N) CALL ERROR(9) IF (ERR .GT. 0) RETURN SR = -STKR(L2) SI = -STKI(L2) GO TO 58 58 DO 59 I = 1, N LL = L + (I-1)*(N+1) STKR(LL) = FLOP(STKR(LL)+SR) STKI(LL) = FLOP(STKI(LL)+SI) 59 CONTINUE GO TO 99 C C COLON 60 E2 = STKR(L2) ST = 1.0D0 N = 0 IF (RHS .LT. 3) GO TO 61 ST = STKR(L) TOP = TOP-1 L = LSTK(TOP) IF (ST .EQ. 0.0D0) GO TO 63 61 E1 = STKR(L) C CHECK FOR CLAUSE IF (RSTK(PT) .EQ. 3) GO TO 64 ERR = L + MAX0(3,IDINT((E2-E1)/ST)) - LSTK(BOT) IF (ERR .GT. 0) CALL ERROR(17) IF (ERR .GT. 0) RETURN 62 IF (ST .GT. 0.0D0 .AND. STKR(L) .GT. E2) GO TO 63 IF (ST .LT. 0.0D0 .AND. STKR(L) .LT. E2) GO TO 63 N = N+1 L = L+1 STKR(L) = E1 + DFLOAT(N)*ST STKI(L) = 0.0D0 GO TO 62 63 NSTK(TOP) = N MSTK(TOP) = 1 IF (N .EQ. 0) MSTK(TOP) = 0 GO TO 99 C C FOR CLAUSE 64 STKR(L) = E1 STKR(L+1) = ST STKR(L+2) = E2 MSTK(TOP) = -3 NSTK(TOP) = -1 GO TO 99 C C ELEMENTWISE OPERATIONS 70 OP = OP - DOT IF (M.NE.M2 .OR. N.NE.N2) CALL ERROR(10) IF (ERR .GT. 0) RETURN MN = M*N DO 72 I = 1, MN J = L+I-1 K = L2+I-1 IF (OP .EQ. STAR) $ CALL WMUL(STKR(J),STKI(J),STKR(K),STKI(K),STKR(J),STKI(J)) IF (OP .EQ. SLASH) $ CALL WDIV(STKR(J),STKI(J),STKR(K),STKI(K),STKR(J),STKI(J)) IF (OP .EQ. BSLASH) $ CALL WDIV(STKR(K),STKI(K),STKR(J),STKI(J),STKR(J),STKI(J)) IF (ERR .GT. 0) RETURN 72 CONTINUE GO TO 99 C C KRONECKER 80 FIN = OP - 2*DOT - STAR + 11 FUN = 6 TOP = TOP + 1 RHS = 2 GO TO 99 C 99 RETURN END SUBROUTINE STACKG(ID) INTEGER ID(4) C C GET VARIABLES FROM STORAGE 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 LOGICAL EQID IF (DDT .EQ. 1) WRITE(WTE,100) ID 100 FORMAT(1X,'STACKG',4I4) CALL PUTID(IDSTK(1,BOT-1), ID) K = LSIZE+1 10 K = K-1 IF (.NOT.EQID(IDSTK(1,K), ID)) GO TO 10 IF (K .GE. LSIZE-1 .AND. RHS .GT. 0) GO TO 98 IF (K .EQ. BOT-1) GO TO 98 LK = LSTK(K) IF (RHS .EQ. 1) GO TO 40 IF (RHS .EQ. 2) GO TO 60 IF (RHS .GT. 2) CALL ERROR(21) IF (ERR .GT. 0) RETURN L = 1 IF (TOP .GT. 0) L = LSTK(TOP) + MSTK(TOP)*NSTK(TOP) IF (TOP+1 .GE. BOT) CALL ERROR(18) IF (ERR .GT. 0) RETURN TOP = TOP+1 C C LOAD VARIABLE TO TOP OF STACK LSTK(TOP) = L MSTK(TOP) = MSTK(K) NSTK(TOP) = NSTK(K) MN = MSTK(K)*NSTK(K) ERR = L+MN - LSTK(BOT) IF (ERR .GT. 0) CALL ERROR(17) IF (ERR .GT. 0) RETURN C IF RAND, MATFN6 GENERATES RANDOM NUMBER IF (K .EQ. LSIZE) GO TO 97 CALL WCOPY(MN,STKR(LK),STKI(LK),1,STKR(L),STKI(L),1) GO TO 99 C C VECT(ARG) 40 IF (MSTK(TOP) .EQ. 0) GO TO 99 L = LSTK(TOP) MN = MSTK(TOP)*NSTK(TOP) MNK = MSTK(K)*NSTK(K) IF (MSTK(TOP) .LT. 0) MN = MNK DO 50 I = 1, MN LL = L+I-1 LS = LK+I-1 IF (MSTK(TOP) .GT. 0) LS = LK + IDINT(STKR(LL)) - 1 IF (LS .LT. LK .OR. LS .GE. LK+MNK) CALL ERROR(21) IF (ERR .GT. 0) RETURN STKR(LL) = STKR(LS) STKI(LL) = STKI(LS) 50 CONTINUE MSTK(TOP) = 1 NSTK(TOP) = 1 IF (MSTK(K) .GT. 1) MSTK(TOP) = MN IF (MSTK(K) .EQ. 1) NSTK(TOP) = MN GO TO 99 C C MATRIX(ARG,ARG) 60 TOP = TOP-1 L = LSTK(TOP) IF (MSTK(TOP+1) .EQ. 0) MSTK(TOP) = 0 IF (MSTK(TOP) .EQ. 0) GO TO 99 L2 = LSTK(TOP+1) M = MSTK(TOP)*NSTK(TOP) IF (MSTK(TOP) .LT. 0) M = MSTK(K) N = MSTK(TOP+1)*NSTK(TOP+1) IF (MSTK(TOP+1) .LT. 0) N = NSTK(K) L3 = L2 + N MK = MSTK(K) MNK = MSTK(K)*NSTK(K) DO 70 J = 1, N DO 70 I = 1, M LI = L+I-1 IF (MSTK(TOP) .GT. 0) LI = L + IDINT(STKR(LI)) - 1 LJ = L2+J-1 IF (MSTK(TOP+1) .GT. 0) LJ = L2 + IDINT(STKR(LJ)) - 1 LS = LK + LI-L + (LJ-L2)*MK IF (LS.LT.LK .OR. LS.GE.LK+MNK) CALL ERROR(21) IF (ERR .GT. 0) RETURN LL = L3 + I-1 + (J-1)*M STKR(LL) = STKR(LS) STKI(LL) = STKI(LS) 70 CONTINUE MN = M*N CALL WCOPY(MN,STKR(L3),STKI(L3),1,STKR(L),STKI(L),1) MSTK(TOP) = M NSTK(TOP) = N GO TO 99 97 FIN = 7 FUN = 6 RETURN 98 FIN = 0 RETURN 99 FIN = -1 FUN = 0 RETURN END SUBROUTINE STACKP(ID) INTEGER ID(4) C C PUT VARIABLES INTO STORAGE 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 LOGICAL EQID INTEGER SEMI DATA SEMI/39/ IF (DDT .EQ. 1) WRITE(WTE,100) ID 100 FORMAT(1X,'STACKP',4I4) IF (TOP .LE. 0) CALL ERROR(1) IF (ERR .GT. 0) RETURN CALL FUNS(ID) IF (FIN .NE. 0) CALL ERROR(25) IF (ERR .GT. 0) RETURN M = MSTK(TOP) N = NSTK(TOP) IF (M .GT. 0) L = LSTK(TOP) IF (M .LT. 0) CALL ERROR(14) IF (ERR .GT. 0) RETURN IF (M .EQ. 0 .AND. N .NE. 0) GO TO 99 MN = M*N LK = 0 MK = 1 NK = 0 LT = 0 MT = 0 NT = 0 C C DOES VARIABLE ALREADY EXIST CALL PUTID(IDSTK(1,BOT-1),ID) K = LSIZE+1 05 K = K-1 IF (.NOT.EQID(IDSTK(1,K),ID)) GO TO 05 IF (K .EQ. BOT-1) GO TO 30 LK = LSTK(K) MK = MSTK(K) NK = NSTK(K) MNK = MK*NK IF (RHS .EQ. 0) GO TO 20 IF (RHS .GT. 2) CALL ERROR(15) IF (ERR .GT. 0) RETURN MT = MK NT = NK LT = L + MN ERR = LT + MNK - LSTK(BOT) IF (ERR .GT. 0) CALL ERROR(17) IF (ERR .GT. 0) RETURN CALL WCOPY(MNK,STKR(LK),STKI(LK),1,STKR(LT),STKI(LT),1) C C DOES IT FIT 20 IF (RHS.EQ.0 .AND. MN.EQ.MNK) GO TO 40 IF (K .GE. LSIZE-3) CALL ERROR(13) IF (ERR .GT. 0) RETURN C C SHIFT STORAGE IF (K .EQ. BOT) GO TO 25 LS = LSTK(BOT) LL = LS + MNK CALL WCOPY(LK-LS,STKR(LS),STKI(LS),-1,STKR(LL),STKI(LL),-1) KM1 = K-1 DO 24 IB = BOT, KM1 I = BOT+KM1-IB CALL PUTID(IDSTK(1,I+1),IDSTK(1,I)) MSTK(I+1) = MSTK(I) NSTK(I+1) = NSTK(I) LSTK(I+1) = LSTK(I)+MNK 24 CONTINUE C C DESTROY OLD VARIABLE 25 BOT = BOT+1 C C CREATE NEW VARIABLE 30 IF (MN .EQ. 0) GO TO 99 IF (BOT-2 .LE. TOP) CALL ERROR(18) IF (ERR .GT. 0) RETURN K = BOT-1 CALL PUTID(IDSTK(1,K), ID) IF (RHS .EQ. 1) GO TO 50 IF (RHS .EQ. 2) GO TO 55 C C STORE 40 IF (K .LT. LSIZE) LSTK(K) = LSTK(K+1) - MN MSTK(K) = M NSTK(K) = N LK = LSTK(K) CALL WCOPY(MN,STKR(L),STKI(L),-1,STKR(LK),STKI(LK),-1) GO TO 90 C C VECT(ARG) 50 IF (MSTK(TOP-1) .LT. 0) GO TO 59 MN1 = 1 MN2 = 1 L1 = 0 L2 = 0 IF (N.NE.1 .OR. NK.NE.1) GO TO 52 L1 = LSTK(TOP-1) M1 = MSTK(TOP-1) MN1 = M1*NSTK(TOP-1) M2 = -1 GO TO 60 52 IF (M.NE.1 .OR. MK.NE.1) CALL ERROR(15) IF (ERR .GT. 0) RETURN L2 = LSTK(TOP-1) M2 = MSTK(TOP-1) MN2 = M2*NSTK(TOP-1) M1 = -1 GO TO 60 C C MATRIX(ARG,ARG) 55 IF (MSTK(TOP-1).LT.0 .AND. MSTK(TOP-2).LT.0) GO TO 59 L2 = LSTK(TOP-1) M2 = MSTK(TOP-1) MN2 = M2*NSTK(TOP-1) IF (M2 .LT. 0) MN2 = N L1 = LSTK(TOP-2) M1 = MSTK(TOP-2) MN1 = M1*NSTK(TOP-2) IF (M1 .LT. 0) MN1 = M GO TO 60 C 59 IF (MN .NE. MNK) CALL ERROR(15) IF (ERR .GT. 0) RETURN LK = LSTK(K) CALL WCOPY(MN,STKR(L),STKI(L),-1,STKR(LK),STKI(LK),-1) GO TO 90 C 60 IF (MN1.NE.M .OR. MN2.NE.N) CALL ERROR(15) IF (ERR .GT. 0) RETURN LL = 1 IF (M1 .LT. 0) GO TO 62 DO 61 I = 1, MN1 LS = L1+I-1 MK = MAX0(MK,IDINT(STKR(LS))) LL = MIN0(LL,IDINT(STKR(LS))) 61 CONTINUE 62 MK = MAX0(MK,M) IF (M2 .LT. 0) GO TO 64 DO 63 I = 1, MN2 LS = L2+I-1 NK = MAX0(NK,IDINT(STKR(LS))) LL = MIN0(LL,IDINT(STKR(LS))) 63 CONTINUE 64 NK = MAX0(NK,N) IF (LL .LT. 1) CALL ERROR(21) IF (ERR .GT. 0) RETURN MNK = MK*NK LK = LSTK(K+1) - MNK ERR = LT + MT*NT - LK IF (ERR .GT. 0) CALL ERROR(17) IF (ERR .GT. 0) RETURN LSTK(K) = LK MSTK(K) = MK NSTK(K) = NK CALL WSET(MNK,0.0D0,0.0D0,STKR(LK),STKI(LK),1) IF (NT .LT. 1) GO TO 67 DO 66 J = 1, NT LS = LT+(J-1)*MT LL = LK+(J-1)*MK CALL WCOPY(MT,STKR(LS),STKI(LS),-1,STKR(LL),STKI(LL),-1) 66 CONTINUE 67 DO 68 J = 1, N DO 68 I = 1, M LI = L1+I-1 IF (M1 .GT. 0) LI = L1 + IDINT(STKR(LI)) - 1 LJ = L2+J-1 IF (M2 .GT. 0) LJ = L2 + IDINT(STKR(LJ)) - 1 LL = LK+LI-L1+(LJ-L2)*MK LS = L+I-1+(J-1)*M STKR(LL) = STKR(LS) STKI(LL) = STKI(LS) 68 CONTINUE GO TO 90 C C PRINT IF DESIRED AND POP STACK 90 IF (SYM.NE.SEMI .AND. LCT(3).EQ.0) CALL PRINT(ID,K) IF (SYM.EQ.SEMI .AND. LCT(3).EQ.1) CALL PRINT(ID,K) IF (K .EQ. BOT-1) BOT = BOT-1 99 IF (M .NE. 0) TOP = TOP - 1 - RHS IF (M .EQ. 0) TOP = TOP - 1 RETURN END SUBROUTINE TERM 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 INTEGER R,OP,BSLASH,STAR,SLASH,DOT DATA BSLASH/45/,STAR/43/,SLASH/44/,DOT/47/ IF (DDT .EQ. 1) WRITE(WTE,100) PT,RSTK(PT) 100 FORMAT(1X,'TERM ',2I4) R = RSTK(PT) GO TO (99,99,99,99,99,01,01,05,25,99,99,99,99,99,35,99,99,99,99),R 01 PT = PT+1 RSTK(PT) = 8 C *CALL* FACTOR RETURN 05 PT = PT-1 10 OP = 0 IF (SYM .EQ. DOT) OP = DOT IF (SYM .EQ. DOT) CALL GETSYM IF (SYM.EQ.STAR .OR. SYM.EQ.SLASH .OR. SYM.EQ.BSLASH) GO TO 20 RETURN 20 OP = OP + SYM CALL GETSYM IF (SYM .EQ. DOT) OP = OP + SYM IF (SYM .EQ. DOT) CALL GETSYM PT = PT+1 PSTK(PT) = OP RSTK(PT) = 9 C *CALL* FACTOR RETURN 25 OP = PSTK(PT) PT = PT-1 CALL STACK2(OP) IF (ERR .GT. 0) RETURN C SOME BINARY OPS DONE IN MATFNS IF (FUN .EQ. 0) GO TO 10 PT = PT+1 RSTK(PT) = 15 C *CALL* MATFN RETURN 35 PT = PT-1 GO TO 10 99 CALL ERROR(22) IF (ERR .GT. 0) RETURN RETURN END SUBROUTINE USER(A,M,N,S,T) DOUBLE PRECISION A(M,N),S,T C INTEGER A3(9) DATA A3 /-149,537,-27,-50,180,-9,-154,546,-25/ IF (A(1,1) .NE. 3.0D0) RETURN DO 10 I = 1, 9 A(I,1) = DFLOAT(A3(I)) 10 CONTINUE M = 3 N = 3 RETURN END SUBROUTINE XCHAR(BUF,K) INTEGER BUF(1),K C C SYSTEM DEPENDENT ROUTINE TO HANDLE SPECIAL CHARACTERS C C INTEGER BACK,MASK DATA BACK/Z'20202008'/,MASK/Z'000000FF'/ C IF (BUF(1) .EQ. BACK) K = -1 L = BUF(1) .AND. MASK IF (K .NE. -1) WRITE(6,10) BUF(1),L 10 FORMAT(1X,1H',A1,4H' = ,Z2,' hex is not a MATLAB character.') RETURN END SUBROUTINE WGECO(AR,AI,LDA,N,IPVT,RCOND,ZR,ZI) INTEGER LDA,N,IPVT(1) DOUBLE PRECISION AR(LDA,1),AI(LDA,1),ZR(1),ZI(1) DOUBLE PRECISION RCOND C C WGECO FACTORS A DOUBLE-COMPLEX MATRIX BY GAUSSIAN ELIMINATION C AND ESTIMATES THE CONDITION OF THE MATRIX. C C IF RCOND IS NOT NEEDED, WGEFA IS SLIGHTLY FASTER. C TO SOLVE A*X = B , FOLLOW WGECO BY WGESL. C TO COMPUTE INVERSE(A)*C , FOLLOW WGECO BY WGESL. C TO COMPUTE DETERMINANT(A) , FOLLOW WGECO BY WGEDI. C TO COMPUTE INVERSE(A) , FOLLOW WGECO BY WGEDI. C C ON ENTRY C C A DOUBLE-COMPLEX(LDA, N) C THE MATRIX TO BE FACTORED. C C LDA INTEGER C THE LEADING DIMENSION OF THE ARRAY A . C C N INTEGER C THE ORDER OF THE MATRIX A . C C ON RETURN C C A AN UPPER TRIANGULAR MATRIX AND THE MULTIPLIERS C WHICH WERE USED TO OBTAIN IT. C THE FACTORIZATION CAN BE WRITTEN A = L*U WHERE C L IS A PRODUCT OF PERMUTATION AND UNIT LOWER C TRIANGULAR MATRICES AND U IS UPPER TRIANGULAR. C C IPVT INTEGER(N) C AN INTEGER VECTOR OF PIVOT INDICES. C C RCOND DOUBLE PRECISION C AN ESTIMATE OF THE RECIPROCAL CONDITION OF A . C FOR THE SYSTEM A*X = B , RELATIVE PERTURBATIONS C IN A AND B OF SIZE EPSILON MAY CAUSE C RELATIVE PERTURBATIONS IN X OF SIZE EPSILON/RCOND . C IF RCOND IS SO SMALL THAT THE LOGICAL EXPRESSION C 1.0 + RCOND .EQ. 1.0 C IS TRUE, THEN A MAY BE SINGULAR TO WORKING C PRECISION. IN PARTICULAR, RCOND IS ZERO IF C EXACT SINGULARITY IS DETECTED OR THE ESTIMATE C UNDERFLOWS. C C Z DOUBLE-COMPLEX(N) C A WORK VECTOR WHOSE CONTENTS ARE USUALLY UNIMPORTANT. C IF A IS CLOSE TO A SINGULAR MATRIX, THEN Z IS C AN APPROXIMATE NULL VECTOR IN THE SENSE THAT C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) . C C LINPACK. THIS VERSION DATED 07/01/79 . C CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB. C C SUBROUTINES AND FUNCTIONS C C LINPACK WGEFA C BLAS WAXPY,WDOTC,WASUM C FORTRAN DABS,DMAX1 C C INTERNAL VARIABLES C DOUBLE PRECISION WDOTCR,WDOTCI,EKR,EKI,TR,TI,WKR,WKI,WKMR,WKMI DOUBLE PRECISION ANORM,S,WASUM,SM,YNORM,FLOP INTEGER INFO,J,K,KB,KP1,L C DOUBLE PRECISION ZDUMR,ZDUMI DOUBLE PRECISION CABS1 CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI) C C COMPUTE 1-NORM OF A C ANORM = 0.0D0 DO 10 J = 1, N ANORM = DMAX1(ANORM,WASUM(N,AR(1,J),AI(1,J),1)) 10 CONTINUE C C FACTOR C CALL WGEFA(AR,AI,LDA,N,IPVT,INFO) C C RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) . C ESTIMATE = NORM(Z)/NORM(Y) WHERE A*Z = Y AND CTRANS(A)*Y = E . C CTRANS(A) IS THE CONJUGATE TRANSPOSE OF A . C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL C GROWTH IN THE ELEMENTS OF W WHERE CTRANS(U)*W = E . C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW. C C SOLVE CTRANS(U)*W = E C EKR = 1.0D0 EKI = 0.0D0 DO 20 J = 1, N ZR(J) = 0.0D0 ZI(J) = 0.0D0 20 CONTINUE DO 110 K = 1, N CALL WSIGN(EKR,EKI,-ZR(K),-ZI(K),EKR,EKI) IF (CABS1(EKR-ZR(K),EKI-ZI(K)) * .LE. CABS1(AR(K,K),AI(K,K))) GO TO 40 S = CABS1(AR(K,K),AI(K,K)) * /CABS1(EKR-ZR(K),EKI-ZI(K)) CALL WRSCAL(N,S,ZR,ZI,1) EKR = S*EKR EKI = S*EKI 40 CONTINUE WKR = EKR - ZR(K) WKI = EKI - ZI(K) WKMR = -EKR - ZR(K) WKMI = -EKI - ZI(K) S = CABS1(WKR,WKI) SM = CABS1(WKMR,WKMI) IF (CABS1(AR(K,K),AI(K,K)) .EQ. 0.0D0) GO TO 50 CALL WDIV(WKR,WKI,AR(K,K),-AI(K,K),WKR,WKI) CALL WDIV(WKMR,WKMI,AR(K,K),-AI(K,K),WKMR,WKMI) GO TO 60 50 CONTINUE WKR = 1.0D0 WKI = 0.0D0 WKMR = 1.0D0 WKMI = 0.0D0 60 CONTINUE KP1 = K + 1 IF (KP1 .GT. N) GO TO 100 DO 70 J = KP1, N CALL WMUL(WKMR,WKMI,AR(K,J),-AI(K,J),TR,TI) SM = FLOP(SM + CABS1(ZR(J)+TR,ZI(J)+TI)) CALL WAXPY(1,WKR,WKI,AR(K,J),-AI(K,J),1, $ ZR(J),ZI(J),1) S = FLOP(S + CABS1(ZR(J),ZI(J))) 70 CONTINUE IF (S .GE. SM) GO TO 90 TR = WKMR - WKR TI = WKMI - WKI WKR = WKMR WKI = WKMI DO 80 J = KP1, N CALL WAXPY(1,TR,TI,AR(K,J),-AI(K,J),1, $ ZR(J),ZI(J),1) 80 CONTINUE 90 CONTINUE 100 CONTINUE ZR(K) = WKR ZI(K) = WKI 110 CONTINUE S = 1.0D0/WASUM(N,ZR,ZI,1) CALL WRSCAL(N,S,ZR,ZI,1) C C SOLVE CTRANS(L)*Y = W C DO 140 KB = 1, N K = N + 1 - KB IF (K .GE. N) GO TO 120 ZR(K) = ZR(K) * + WDOTCR(N-K,AR(K+1,K),AI(K+1,K),1,ZR(K+1),ZI(K+1),1) ZI(K) = ZI(K) * + WDOTCI(N-K,AR(K+1,K),AI(K+1,K),1,ZR(K+1),ZI(K+1),1) 120 CONTINUE IF (CABS1(ZR(K),ZI(K)) .LE. 1.0D0) GO TO 130 S = 1.0D0/CABS1(ZR(K),ZI(K)) CALL WRSCAL(N,S,ZR,ZI,1) 130 CONTINUE L = IPVT(K) TR = ZR(L) TI = ZI(L) ZR(L) = ZR(K) ZI(L) = ZI(K) ZR(K) = TR ZI(K) = TI 140 CONTINUE S = 1.0D0/WASUM(N,ZR,ZI,1) CALL WRSCAL(N,S,ZR,ZI,1) C YNORM = 1.0D0 C C SOLVE L*V = Y C DO 160 K = 1, N L = IPVT(K) TR = ZR(L) TI = ZI(L) ZR(L) = ZR(K) ZI(L) = ZI(K) ZR(K) = TR ZI(K) = TI IF (K .LT. N) * CALL WAXPY(N-K,TR,TI,AR(K+1,K),AI(K+1,K),1,ZR(K+1),ZI(K+1), * 1) IF (CABS1(ZR(K),ZI(K)) .LE. 1.0D0) GO TO 150 S = 1.0D0/CABS1(ZR(K),ZI(K)) CALL WRSCAL(N,S,ZR,ZI,1) YNORM = S*YNORM 150 CONTINUE 160 CONTINUE S = 1.0D0/WASUM(N,ZR,ZI,1) CALL WRSCAL(N,S,ZR,ZI,1) YNORM = S*YNORM C C SOLVE U*Z = V C DO 200 KB = 1, N K = N + 1 - KB IF (CABS1(ZR(K),ZI(K)) * .LE. CABS1(AR(K,K),AI(K,K))) GO TO 170 S = CABS1(AR(K,K),AI(K,K)) * /CABS1(ZR(K),ZI(K)) CALL WRSCAL(N,S,ZR,ZI,1) YNORM = S*YNORM 170 CONTINUE IF (CABS1(AR(K,K),AI(K,K)) .EQ. 0.0D0) GO TO 180 CALL WDIV(ZR(K),ZI(K),AR(K,K),AI(K,K),ZR(K),ZI(K)) 180 CONTINUE IF (CABS1(AR(K,K),AI(K,K)) .NE. 0.0D0) GO TO 190 ZR(K) = 1.0D0 ZI(K) = 0.0D0 190 CONTINUE TR = -ZR(K) TI = -ZI(K) CALL WAXPY(K-1,TR,TI,AR(1,K),AI(1,K),1,ZR(1),ZI(1),1) 200 CONTINUE C MAKE ZNORM = 1.0 S = 1.0D0/WASUM(N,ZR,ZI,1) CALL WRSCAL(N,S,ZR,ZI,1) YNORM = S*YNORM C IF (ANORM .NE. 0.0D0) RCOND = YNORM/ANORM IF (ANORM .EQ. 0.0D0) RCOND = 0.0D0 RETURN END SUBROUTINE WGEFA(AR,AI,LDA,N,IPVT,INFO) INTEGER LDA,N,IPVT(1),INFO DOUBLE PRECISION AR(LDA,1),AI(LDA,1) C C WGEFA FACTORS A DOUBLE-COMPLEX MATRIX BY GAUSSIAN ELIMINATION. C C WGEFA IS USUALLY CALLED BY WGECO, BUT IT CAN BE CALLED C DIRECTLY WITH A SAVING IN TIME IF RCOND IS NOT NEEDED. C (TIME FOR WGECO) = (1 + 9/N)*(TIME FOR WGEFA) . C C ON ENTRY C C A DOUBLE-COMPLEX(LDA, N) C THE MATRIX TO BE FACTORED. C C LDA INTEGER C THE LEADING DIMENSION OF THE ARRAY A . C C N INTEGER C THE ORDER OF THE MATRIX A . C C ON RETURN C C A AN UPPER TRIANGULAR MATRIX AND THE MULTIPLIERS C WHICH WERE USED TO OBTAIN IT. C THE FACTORIZATION CAN BE WRITTEN A = L*U WHERE C L IS A PRODUCT OF PERMUTATION AND UNIT LOWER C TRIANGULAR MATRICES AND U IS UPPER TRIANGULAR. C C IPVT INTEGER(N) C AN INTEGER VECTOR OF PIVOT INDICES. C C INFO INTEGER C = 0 NORMAL VALUE. C = K IF U(K,K) .EQ. 0.0 . THIS IS NOT AN ERROR C CONDITION FOR THIS SUBROUTINE, BUT IT DOES C INDICATE THAT WGESL OR WGEDI WILL DIVIDE BY ZERO C IF CALLED. USE RCOND IN WGECO FOR A RELIABLE C INDICATION OF SINGULARITY. C C LINPACK. THIS VERSION DATED 07/01/79 . C CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB. C C SUBROUTINES AND FUNCTIONS C C BLAS WAXPY,WSCAL,IWAMAX C FORTRAN DABS C C INTERNAL VARIABLES C DOUBLE PRECISION TR,TI INTEGER IWAMAX,J,K,KP1,L,NM1 C DOUBLE PRECISION ZDUMR,ZDUMI DOUBLE PRECISION CABS1 CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI) C C GAUSSIAN ELIMINATION WITH PARTIAL PIVOTING C INFO = 0 NM1 = N - 1 IF (NM1 .LT. 1) GO TO 70 DO 60 K = 1, NM1 KP1 = K + 1 C C FIND L = PIVOT INDEX C L = IWAMAX(N-K+1,AR(K,K),AI(K,K),1) + K - 1 IPVT(K) = L C C ZERO PIVOT IMPLIES THIS COLUMN ALREADY TRIANGULARIZED C IF (CABS1(AR(L,K),AI(L,K)) .EQ. 0.0D0) GO TO 40 C C INTERCHANGE IF NECESSARY C IF (L .EQ. K) GO TO 10 TR = AR(L,K) TI = AI(L,K) AR(L,K) = AR(K,K) AI(L,K) = AI(K,K) AR(K,K) = TR AI(K,K) = TI 10 CONTINUE C C COMPUTE MULTIPLIERS C CALL WDIV(-1.0D0,0.0D0,AR(K,K),AI(K,K),TR,TI) CALL WSCAL(N-K,TR,TI,AR(K+1,K),AI(K+1,K),1) C C ROW ELIMINATION WITH COLUMN INDEXING C DO 30 J = KP1, N TR = AR(L,J) TI = AI(L,J) IF (L .EQ. K) GO TO 20 AR(L,J) = AR(K,J) AI(L,J) = AI(K,J) AR(K,J) = TR AI(K,J) = TI 20 CONTINUE CALL WAXPY(N-K,TR,TI,AR(K+1,K),AI(K+1,K),1,AR(K+1,J), * AI(K+1,J),1) 30 CONTINUE GO TO 50 40 CONTINUE INFO = K 50 CONTINUE 60 CONTINUE 70 CONTINUE IPVT(N) = N IF (CABS1(AR(N,N),AI(N,N)) .EQ. 0.0D0) INFO = N RETURN END SUBROUTINE WGESL(AR,AI,LDA,N,IPVT,BR,BI,JOB) INTEGER LDA,N,IPVT(1),JOB DOUBLE PRECISION AR(LDA,1),AI(LDA,1),BR(1),BI(1) C C WGESL SOLVES THE DOUBLE-COMPLEX SYSTEM C A * X = B OR CTRANS(A) * X = B C USING THE FACTORS COMPUTED BY WGECO OR WGEFA. C C ON ENTRY C C A DOUBLE-COMPLEX(LDA, N) C THE OUTPUT FROM WGECO OR WGEFA. C C LDA INTEGER C THE LEADING DIMENSION OF THE ARRAY A . C C N INTEGER C THE ORDER OF THE MATRIX A . C C IPVT INTEGER(N) C THE PIVOT VECTOR FROM WGECO OR WGEFA. C C B DOUBLE-COMPLEX(N) C THE RIGHT HAND SIDE VECTOR. C C JOB INTEGER C = 0 TO SOLVE A*X = B , C = NONZERO TO SOLVE CTRANS(A)*X = B WHERE C CTRANS(A) IS THE CONJUGATE TRANSPOSE. C C ON RETURN C C B THE SOLUTION VECTOR X . C C ERROR CONDITION C C A DIVISION BY ZERO WILL OCCUR IF THE INPUT FACTOR CONTAINS A C ZERO ON THE DIAGONAL. TECHNICALLY THIS INDICATES SINGULARITY C BUT IT IS OFTEN CAUSED BY IMPROPER ARGUMENTS OR IMPROPER C SETTING OF LDA . IT WILL NOT OCCUR IF THE SUBROUTINES ARE C CALLED CORRECTLY AND IF WGECO HAS SET RCOND .GT. 0.0 C OR WGEFA HAS SET INFO .EQ. 0 . C C TO COMPUTE INVERSE(A) * C WHERE C IS A MATRIX C WITH P COLUMNS C CALL WGECO(A,LDA,N,IPVT,RCOND,Z) C IF (RCOND IS TOO SMALL) GO TO ... C DO 10 J = 1, P C CALL WGESL(A,LDA,N,IPVT,C(1,J),0) C 10 CONTINUE C C LINPACK. THIS VERSION DATED 07/01/79 . C CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB. C C SUBROUTINES AND FUNCTIONS C C BLAS WAXPY,WDOTC C C INTERNAL VARIABLES C DOUBLE PRECISION WDOTCR,WDOTCI,TR,TI INTEGER K,KB,L,NM1 C NM1 = N - 1 IF (JOB .NE. 0) GO TO 50 C C JOB = 0 , SOLVE A * X = B C FIRST SOLVE L*Y = B C IF (NM1 .LT. 1) GO TO 30 DO 20 K = 1, NM1 L = IPVT(K) TR = BR(L) TI = BI(L) IF (L .EQ. K) GO TO 10 BR(L) = BR(K) BI(L) = BI(K) BR(K) = TR BI(K) = TI 10 CONTINUE CALL WAXPY(N-K,TR,TI,AR(K+1,K),AI(K+1,K),1,BR(K+1),BI(K+1), * 1) 20 CONTINUE 30 CONTINUE C C NOW SOLVE U*X = Y C DO 40 KB = 1, N K = N + 1 - KB CALL WDIV(BR(K),BI(K),AR(K,K),AI(K,K),BR(K),BI(K)) TR = -BR(K) TI = -BI(K) CALL WAXPY(K-1,TR,TI,AR(1,K),AI(1,K),1,BR(1),BI(1),1) 40 CONTINUE GO TO 100 50 CONTINUE C C JOB = NONZERO, SOLVE CTRANS(A) * X = B C FIRST SOLVE CTRANS(U)*Y = B C DO 60 K = 1, N TR = BR(K) - WDOTCR(K-1,AR(1,K),AI(1,K),1,BR(1),BI(1),1) TI = BI(K) - WDOTCI(K-1,AR(1,K),AI(1,K),1,BR(1),BI(1),1) CALL WDIV(TR,TI,AR(K,K),-AI(K,K),BR(K),BI(K)) 60 CONTINUE C C NOW SOLVE CTRANS(L)*X = Y C IF (NM1 .LT. 1) GO TO 90 DO 80 KB = 1, NM1 K = N - KB BR(K) = BR(K) * + WDOTCR(N-K,AR(K+1,K),AI(K+1,K),1,BR(K+1),BI(K+1),1) BI(K) = BI(K) * + WDOTCI(N-K,AR(K+1,K),AI(K+1,K),1,BR(K+1),BI(K+1),1) L = IPVT(K) IF (L .EQ. K) GO TO 70 TR = BR(L) TI = BI(L) BR(L) = BR(K) BI(L) = BI(K) BR(K) = TR BI(K) = TI 70 CONTINUE 80 CONTINUE 90 CONTINUE 100 CONTINUE RETURN END SUBROUTINE WGEDI(AR,AI,LDA,N,IPVT,DETR,DETI,WORKR,WORKI,JOB) INTEGER LDA,N,IPVT(1),JOB DOUBLE PRECISION AR(LDA,1),AI(LDA,1),DETR(2),DETI(2),WORKR(1), * WORKI(1) C C WGEDI COMPUTES THE DETERMINANT AND INVERSE OF A MATRIX C USING THE FACTORS COMPUTED BY WGECO OR WGEFA. C C ON ENTRY C C A DOUBLE-COMPLEX(LDA, N) C THE OUTPUT FROM WGECO OR WGEFA. C C LDA INTEGER C THE LEADING DIMENSION OF THE ARRAY A . C C N INTEGER C THE ORDER OF THE MATRIX A . C C IPVT INTEGER(N) C THE PIVOT VECTOR FROM WGECO OR WGEFA. C C WORK DOUBLE-COMPLEX(N) C WORK VECTOR. CONTENTS DESTROYED. C C JOB INTEGER C = 11 BOTH DETERMINANT AND INVERSE. C = 01 INVERSE ONLY. C = 10 DETERMINANT ONLY. C C ON RETURN C C A INVERSE OF ORIGINAL MATRIX IF REQUESTED. C OTHERWISE UNCHANGED. C C DET DOUBLE-COMPLEX(2) C DETERMINANT OF ORIGINAL MATRIX IF REQUESTED. C OTHERWISE NOT REFERENCED. C DETERMINANT = DET(1) * 10.0**DET(2) C WITH 1.0 .LE. CABS1(DET(1) .LT. 10.0 C OR DET(1) .EQ. 0.0 . C C ERROR CONDITION C C A DIVISION BY ZERO WILL OCCUR IF THE INPUT FACTOR CONTAINS C A ZERO ON THE DIAGONAL AND THE INVERSE IS REQUESTED. C IT WILL NOT OCCUR IF THE SUBROUTINES ARE CALLED CORRECTLY C AND IF WGECO HAS SET RCOND .GT. 0.0 OR WGEFA HAS SET C INFO .EQ. 0 . C C LINPACK. THIS VERSION DATED 07/01/79 . C CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB. C C SUBROUTINES AND FUNCTIONS C C BLAS WAXPY,WSCAL,WSWAP C FORTRAN DABS,MOD C C INTERNAL VARIABLES C DOUBLE PRECISION TR,TI DOUBLE PRECISION TEN INTEGER I,J,K,KB,KP1,L,NM1 C DOUBLE PRECISION ZDUMR,ZDUMI DOUBLE PRECISION CABS1 CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI) C C COMPUTE DETERMINANT C IF (JOB/10 .EQ. 0) GO TO 80 DETR(1) = 1.0D0 DETI(1) = 0.0D0 DETR(2) = 0.0D0 DETI(2) = 0.0D0 TEN = 10.0D0 DO 60 I = 1, N IF (IPVT(I) .EQ. I) GO TO 10 DETR(1) = -DETR(1) DETI(1) = -DETI(1) 10 CONTINUE CALL WMUL(AR(I,I),AI(I,I),DETR(1),DETI(1),DETR(1),DETI(1)) C ...EXIT C ...EXIT IF (CABS1(DETR(1),DETI(1)) .EQ. 0.0D0) GO TO 70 20 IF (CABS1(DETR(1),DETI(1)) .GE. 1.0D0) GO TO 30 DETR(1) = TEN*DETR(1) DETI(1) = TEN*DETI(1) DETR(2) = DETR(2) - 1.0D0 DETI(2) = DETI(2) - 0.0D0 GO TO 20 30 CONTINUE 40 IF (CABS1(DETR(1),DETI(1)) .LT. TEN) GO TO 50 DETR(1) = DETR(1)/TEN DETI(1) = DETI(1)/TEN DETR(2) = DETR(2) + 1.0D0 DETI(2) = DETI(2) + 0.0D0 GO TO 40 50 CONTINUE 60 CONTINUE 70 CONTINUE 80 CONTINUE C C COMPUTE INVERSE(U) C IF (MOD(JOB,10) .EQ. 0) GO TO 160 DO 110 K = 1, N CALL WDIV(1.0D0,0.0D0,AR(K,K),AI(K,K),AR(K,K),AI(K,K)) TR = -AR(K,K) TI = -AI(K,K) CALL WSCAL(K-1,TR,TI,AR(1,K),AI(1,K),1) KP1 = K + 1 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.