|
|
1.1 root 1: C PROGRAM MAIN FOR VAX/VMS
2: C For overflow handling, RTFM on Common Run-Time Library.
3: C Also compile subroutine URAND with FORTRAN/NOCHECK.
4: EXTERNAL UNTRAP
5: CALL LIB$ESTABLISH(UNTRAP)
6: CALL MATLAB(0)
7: STOP
8: END
9: INTEGER FUNCTION UNTRAP(SIGARGS,MECHARGS)
10: INTEGER SIGARGS(3),MECHARGS(5)
11: INCLUDE 'SYS$LIBRARY:SIGDEF'
12: INTEGER HUGE(2)
13: DATA HUGE/'FFFF7FFF'X,'FFFFFFFF'X/
14: I = LIB$SIM_TRAP(SIGARGS,MECHARGS)
15: IF (LIB$MATCH_COND (SIGARGS(2), SS$_FLTOVF)) THEN
16: WRITE(6,10)
17: 10 FORMAT(' ---OVERFLOW---')
18: CALL LIB$INSV(1,0,3,SIGARGS(2))
19: UNTRAP = SS$_CONTINUE
20: ELSEIF (LIB$MATCH_COND (SIGARGS(2), SS$_INTOVF)) THEN
21: WRITE(6,12)
22: 12 FORMAT(' ---INTEGER OVERFLOW---')
23: CALL LIB$INSV(2,0,3,SIGARGS(2))
24: UNTRAP = SS$_CONTINUE
25: ELSEIF (LIB$MATCH_COND (SIGARGS(2), SS$_ROPRAND)) THEN
26: UNTRAP = LIB$FIXUP_FLT(SIGARGS,MECHARGS,HUGE)
27: ELSE
28: UNTRAP = SS$_RESIGNAL
29: ENDIF
30: RETURN
31: END
32: SUBROUTINE FILES(LUNIT,NAME,IOSTAT)
33: INTEGER LUNIT,NAME(64),IOSTAT
34: C
35: C SYSTEM DEPENDENT ROUTINE TO ALLOCATE FILES
36: C LUNIT = LOGICAL UNIT NUMBER
37: C = 1, SAVE
38: C = 2, LOAD
39: C = 7, PRINT
40: C = 8, DIARY
41: C > 10, EXEC
42: C < 0, CLOSE -LUNIT
43: C = -5, SPECIAL CASE, END OF FILE DETECTED ON TERMINAL
44: C NAME = FILE NAME, 1 CHARACTER PER WORD
45: C NONZERO IOSTAT RETURNED FOR ERROR CONDITION
46: C
47: C (UNLESS CHANGED IN SUBROUTINE MATLAB, UNITS 5, 6 AND 9 ARE
48: C USED FOR TERMINAL INPUT, TERMINAL OUTPUT AND THE HELP FILE.
49: C THE HELP FILE IS OPENED BY SUBROUTINE HELPER.)
50: C
51: CHARACTER*64 NAM
52: C
53: IF (LUNIT .LT. 0) GO TO 30
54: C
55: C FORTRAN 77 INTERNAL FILE CONVERSION FROM 64A1 TO CHARACTER*64
56: C
57: WRITE(NAM,'(64A1)') NAME
58: C
59: C UNFORMATTED I/O FOR SAVE AND LOAD
60: C FORMATTED I/O FOR EXEC, DIARY AND PRINT
61: C
62: IOSTAT = 0
63: IF (LUNIT .EQ. 1) OPEN(UNIT=LUNIT,FILE=NAM,FORM='UNFORMATTED',
64: > STATUS='NEW',ERR=20,IOSTAT=IOSTAT)
65: IF (LUNIT .EQ. 2) OPEN(UNIT=LUNIT,FILE=NAM,FORM='UNFORMATTED',
66: > STATUS='OLD',ERR=20,IOSTAT=IOSTAT)
67: IF (LUNIT .EQ. 7) OPEN(UNIT=LUNIT,FILE=NAM,
68: > STATUS='NEW',ERR=20,IOSTAT=IOSTAT)
69: IF (LUNIT .EQ. 8) OPEN(UNIT=LUNIT,FILE=NAM,
70: > STATUS='NEW',ERR=20,IOSTAT=IOSTAT)
71: IF (LUNIT .GT. 10) OPEN(UNIT=LUNIT,FILE=NAM,
72: > STATUS='OLD',ERR=20,IOSTAT=IOSTAT)
73: IF (IOSTAT .NE. 0) GO TO 20
74: C
75: C REWIND ALL EXCEPT DIARY
76: C
77: IF (LUNIT .NE. 8) REWIND LUNIT
78: RETURN
79: C
80: C ERROR ON OPEN
81: C
82: 20 IF (IOSTAT .EQ. 0) IOSTAT = -1
83: RETURN
84: C
85: C CLOSE FILES
86: C
87: 30 CLOSE(UNIT=-LUNIT)
88: RETURN
89: END
90: SUBROUTINE SAVLOD(LUNIT,ID,M,N,IMG,JOB,XREAL,XIMAG)
91: INTEGER LUNIT,ID(4),M,N,IMG,JOB
92: DOUBLE PRECISION XREAL(1),XIMAG(1)
93: C
94: C IMPLEMENT SAVE AND LOAD
95: C LUNIT = LOGICAL UNIT NUMBER
96: C ID = NAME, FORMAT 4A1
97: C M, N = DIMENSIONS
98: C IMG = NONZERO IF XIMAG IS NONZERO
99: C JOB = 0 FOR SAVE
100: C = SPACE AVAILABLE FOR LOAD
101: C XREAL, XIMAG = REAL AND OPTIONAL IMAGINARY PARTS
102: C
103: C SYSTEM DEPENDENT FORMATS
104: 101 FORMAT(4A1,3I4)
105: 102 FORMAT(4Z18)
106: C
107: IF (JOB .GT. 0) GO TO 20
108: C
109: C SAVE
110: 10 WRITE(LUNIT,101) ID,M,N,IMG
111: DO 15 J = 1, N
112: K = (J-1)*M+1
113: L = J*M
114: WRITE(LUNIT,102) (XREAL(I),I=K,L)
115: IF (IMG .NE. 0) WRITE(LUNIT,102) (XIMAG(I),I=K,L)
116: 15 CONTINUE
117: RETURN
118: C
119: C LOAD
120: 20 READ(LUNIT,101,END=30) ID,M,N,IMG
121: IF (M*N .GT. JOB) GO TO 30
122: DO 25 J = 1, N
123: K = (J-1)*M+1
124: L = J*M
125: READ(LUNIT,102,END=30) (XREAL(I),I=K,L)
126: IF (IMG .NE. 0) READ(LUNIT,102,END=30) (XIMAG(I),I=K,L)
127: 25 CONTINUE
128: RETURN
129: C
130: C END OF FILE
131: 30 M = 0
132: N = 0
133: RETURN
134: END
135: SUBROUTINE FORMZ(LUNIT,X,Y)
136: DOUBLE PRECISION X,Y
137: C
138: C SYSTEM DEPENDENT ROUTINE TO PRINT WITH Z FORMAT
139: C
140: IF (Y .NE. 0.0D0) WRITE(LUNIT,10) X,Y
141: IF (Y .EQ. 0.0D0) WRITE(LUNIT,10) X
142: 10 FORMAT(2Z18)
143: RETURN
144: END
145: DOUBLE PRECISION FUNCTION FLOP(X)
146: DOUBLE PRECISION X
147: C SYSTEM DEPENDENT FUNCTION
148: C COUNT AND POSSIBLY CHOP EACH FLOATING POINT OPERATION
149: C FLP(1) IS FLOP COUNTER
150: C FLP(2) IS NUMBER OF PLACES TO BE CHOPPED
151: C
152: INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)
153: COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN
154: C
155: DOUBLE PRECISION MASK(14),XX,MM
156: real mas(2,14)
157: LOGICAL LX(2),LM(2)
158: EQUIVALENCE (LX(1),XX),(LM(1),MM)
159: equivalence (mask(1),mas(1))
160: data mas/
161: $ 'ffffffff'x,'fff0ffff'x,
162: $ 'ffffffff'x,'ff00ffff'x,
163: $ 'ffffffff'x,'f000ffff'x,
164: $ 'ffffffff'x,'0000ffff'x,
165: $ 'ffffffff'x,'0000fff0'x,
166: $ 'ffffffff'x,'0000ff00'x,
167: $ 'ffffffff'x,'0000f000'x,
168: $ 'ffffffff'x,'00000000'x,
169: $ 'fff0ffff'x,'00000000'x,
170: $ 'ff00ffff'x,'00000000'x,
171: $ 'f000ffff'x,'00000000'x,
172: $ '0000ffff'x,'00000000'x,
173: $ '0000fff0'x,'00000000'x,
174: $ '0000ff80'x,'00000000'x/
175: C
176: FLP(1) = FLP(1) + 1
177: K = FLP(2)
178: FLOP = X
179: IF (K .LE. 0) RETURN
180: FLOP = 0.0D0
181: IF (K .GE. 15) RETURN
182: XX = X
183: MM = MASK(K)
184: LX(1) = LX(1) .AND. LM(1)
185: LX(2) = LX(2) .AND. LM(2)
186: FLOP = XX
187: RETURN
188: END
189: SUBROUTINE XCHAR(BUF,K)
190: INTEGER BUF(1),K
191: C
192: C SYSTEM DEPENDENT ROUTINE TO HANDLE SPECIAL CHARACTERS
193: C
194: C
195: INTEGER BACK,MASK
196: DATA BACK/'20202008'X/,MASK/'000000FF'X/
197: C
198: IF (BUF(1) .EQ. BACK) K = -1
199: L = BUF(1) .AND. MASK
200: IF (K .NE. -1) WRITE(6,10) BUF(1),L
201: 10 FORMAT(1X,1H',A1,4H' = ,Z2,' hex is not a MATLAB character.')
202: RETURN
203: END
204: SUBROUTINE USER(A,M,N,S,T)
205: DOUBLE PRECISION A(M,N),S,T
206: C
207: INTEGER A3(9)
208: DATA A3 /-149,537,-27,-50,180,-9,-154,546,-25/
209: IF (A(1,1) .NE. 3.0D0) RETURN
210: DO 10 I = 1, 9
211: A(I,1) = A3(I)
212: 10 CONTINUE
213: M = 3
214: N = 3
215: RETURN
216: END
217: SUBROUTINE PROMPT(PAUSE)
218: INTEGER PAUSE
219: C
220: C ISSUE MATLAB PROMPT WITH OPTIONAL PAUSE
221: C
222: INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),RIO,WIO,RTE,WTE,HIO
223: COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,RIO,WIO,RTE,WTE,HIO
224: WRITE(WTE,10)
225: IF (WIO .NE. 0) WRITE(WIO,10)
226: 10 FORMAT(/1X,'<>')
227: IF (PAUSE .EQ. 1) READ(RTE,20) DUMMY
228: 20 FORMAT(A1)
229: RETURN
230: END
231: SUBROUTINE PLOT(LUNIT,X,Y,N,P,K,BUF)
232: DOUBLE PRECISION X(N),Y(N),P(1)
233: INTEGER BUF(79)
234: C
235: C PLOT X VS. Y ON LUNIT
236: C IF K IS NONZERO, THEN P(1),...,P(K) ARE EXTRA PARAMETERS
237: C BUF IS WORK SPACE
238: C
239: DOUBLE PRECISION XMIN,YMIN,XMAX,YMAX,DY,DX,Y1,Y0
240: INTEGER AST,BLANK,H,W
241: DATA AST/1H*/,BLANK/1H /,H/20/,W/79/
242: C
243: C H = HEIGHT, W = WIDTH
244: C
245: XMIN = X(1)
246: XMAX = X(1)
247: YMIN = Y(1)
248: YMAX = Y(1)
249: DO 10 I = 1, N
250: XMIN = DMIN1(XMIN,X(I))
251: XMAX = DMAX1(XMAX,X(I))
252: YMIN = DMIN1(YMIN,Y(I))
253: YMAX = DMAX1(YMAX,Y(I))
254: 10 CONTINUE
255: DX = XMAX - XMIN
256: IF (DX .EQ. 0.0D0) DX = 1.0D0
257: DY = YMAX - YMIN
258: WRITE(LUNIT,35)
259: DO 40 L = 1, H
260: DO 20 J = 1, W
261: BUF(J) = BLANK
262: 20 CONTINUE
263: Y1 = YMIN + (H-L+1)*DY/H
264: Y0 = YMIN + (H-L)*DY/H
265: JMAX = 1
266: DO 30 I = 1, N
267: IF (Y(I) .GT. Y1) GO TO 30
268: IF (L.NE.H .AND. Y(I).LE.Y0) GO TO 30
269: J = 1 + (W-1)*(X(I) - XMIN)/DX
270: BUF(J) = AST
271: JMAX = MAX0(JMAX,J)
272: 30 CONTINUE
273: WRITE(LUNIT,35) (BUF(J),J=1,JMAX)
274: 35 FORMAT(1X,79A1)
275: 40 CONTINUE
276: RETURN
277: END
278: SUBROUTINE EDIT(BUF,N)
279: INTEGER BUF(N)
280: C
281: C CALLED AFTER INPUT OF A SINGLE BACKSLASH
282: C BUF CONTAINS PREVIOUS INPUT LINE, ONE CHAR PER WORD
283: C ENTER LOCAL EDITOR IF AVAILABLE
284: C OTHERWISE JUST
285: RETURN
286: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.