|
|
1.1 root 1: C PROGRAM MAIN
2: CALL ERRSET(208,1000000,-1,1)
3: CALL ERRSET(207,1000000,0,1)
4: CALL MATLAB(0)
5: STOP
6: END
7: SUBROUTINE FILES(LUNIT,NAME,IOSTAT)
8: INTEGER LUNIT,NAME(32)
9: C
10: C SYSTEM DEPENDENT ROUTINE TO ALLOCATE FILES
11: C THIS VERSION FOR IBM CMS
12: C LUNIT = LOGICAL UNIT NUMBER
13: C NAME = FILE NAME, 1 CHARACTER PER WORD
14: C
15: LOGICAL NAML(2),LL
16: DOUBLE PRECISION NAM8
17: EQUIVALENCE (NAML(1),NAM8),(L,LL)
18: C
19: L = -LUNIT
20: IF (LUNIT .LT. 0) REWIND L
21: IF (LUNIT .LT. 0) RETURN
22: C
23: K1 = 2**24
24: K2 = 2**30
25: K3 = 2**7
26: DO 10 I = 1,8
27: IF( NAME(I) .GT. 0 ) NAME(I) = NAME(I)/K1
28: IF( NAME(I) .LT. 0 ) NAME(I) = ((NAME(I)+K2)+K2)/K1+K3
29: 10 CONTINUE
30: NAM8 = 0.0D0
31: DO 20 I = 1,4
32: L = K1*NAME(I)
33: NAML(1) = NAML(1) .OR. LL
34: L = K1*NAME(I+4)
35: NAML(2) = NAML(2) .OR. LL
36: K1 = K1/256
37: 20 CONTINUE
38: IF( LUNIT .EQ. 1 ) REWIND 1
39: IF( LUNIT .EQ. 1 ) CALL CMSCMD(IRTURN,'FILEDEF ','01 ',
40: $ 'DISK ',NAM8,'MATLAB ','A1 ')
41: IF( LUNIT .EQ. 2 ) REWIND 2
42: IF( LUNIT .EQ. 2 ) CALL CMSCMD(IRTURN,'FILEDEF ','02 ',
43: $ 'DISK ',NAM8,'MATLAB ','A1 ')
44: IF( LUNIT .EQ. 11 ) REWIND 11
45: IF( LUNIT .EQ. 11 ) CALL CMSCMD(IRTURN,'FILEDEF ','11 ',
46: $ 'DISK ',NAM8,'MATLAB ','A1 ')
47: RETURN
48: END
49: SUBROUTINE SAVLOD(LUNIT,ID,M,N,IMG,JOB,XREAL,XIMAG)
50: INTEGER LUNIT,ID(4),M,N,IMG,JOB
51: DOUBLE PRECISION XREAL(1),XIMAG(1)
52: C
53: C IMPLEMENT SAVE AND LOAD
54: C LUNIT = LOGICAL UNIT NUMBER
55: C ID = NAME, FORMAT 4A1
56: C M, N = DIMENSIONS
57: C IMG = NONZERO IF XIMAG IS NONZERO
58: C JOB = 0 FOR SAVE
59: C = SPACE AVAILABLE FOR LOAD
60: C XREAL, XIMAG = REAL AND OPTIONAL IMAGINARY PARTS
61: C
62: C SYSTEM DEPENDENT FORMATS
63: 101 FORMAT(4A1,3I4)
64: 102 FORMAT(4Z18)
65: C
66: IF (JOB .GT. 0) GO TO 20
67: C
68: C SAVE
69: 10 WRITE(LUNIT,101) ID,M,N,IMG
70: DO 15 J = 1, N
71: K = (J-1)*M+1
72: L = J*M
73: WRITE(LUNIT,102) (XREAL(I),I=K,L)
74: IF (IMG .NE. 0) WRITE(LUNIT,102) (XIMAG(I),I=K,L)
75: 15 CONTINUE
76: RETURN
77: C
78: C LOAD
79: 20 READ(LUNIT,101,END=30) ID,M,N,IMG
80: IF (M*N .GT. JOB) GO TO 30
81: DO 25 J = 1, N
82: K = (J-1)*M+1
83: L = J*M
84: READ(LUNIT,102,END=30) (XREAL(I),I=K,L)
85: IF (IMG .NE. 0) READ(LUNIT,102,END=30) (XIMAG(I),I=K,L)
86: 25 CONTINUE
87: RETURN
88: C
89: C END OF FILE
90: 30 M = 0
91: N = 0
92: RETURN
93: END
94: SUBROUTINE FORMZ(LUNIT,X,Y)
95: DOUBLE PRECISION X,Y
96: C
97: C SYSTEM DEPENDENT ROUTINE TO PRINT WITH Z FORMAT
98: C
99: IF (Y .NE. 0.0D0) WRITE(LUNIT,10) X,Y
100: IF (Y .EQ. 0.0D0) WRITE(LUNIT,10) X
101: 10 FORMAT(2Z18)
102: RETURN
103: END
104: DOUBLE PRECISION FUNCTION FLOP(X)
105: DOUBLE PRECISION X
106: C SYSTEM DEPENDENT FUNCTION
107: C COUNT AND POSSIBLY CHOP EACH FLOATING POINT OPERATION
108: C FLP(1) IS FLOP COUNTER
109: C FLP(2) IS NUMBER OF PLACES TO BE CHOPPED
110: C
111: INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)
112: COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN
113: C
114: DOUBLE PRECISION MASK(13),XX,MM
115: LOGICAL LX(2),LM(2)
116: EQUIVALENCE (LX(1),XX),(LM(1),MM)
117: DATA MASK / ZFFFFFFFFFFFFFFF0,ZFFFFFFFFFFFFFF00,
118: $ ZFFFFFFFFFFFFF000,ZFFFFFFFFFFFF0000,ZFFFFFFFFFFF00000,
119: $ ZFFFFFFFFFF000000,ZFFFFFFFFF0000000,ZFFFFFFFF00000000,
120: $ ZFFFFFFF000000000,ZFFFFFF0000000000,ZFFFFF00000000000,
121: $ ZFFFF000000000000,ZFFF0000000000000/
122: C
123: FLP(1) = FLP(1) + 1
124: K = FLP(2)
125: FLOP = X
126: IF (K .LE. 0) RETURN
127: FLOP = 0.0D0
128: IF (K .GE. 14) RETURN
129: XX = X
130: MM = MASK(K)
131: LX(1) = LX(1) .AND. LM(1)
132: LX(2) = LX(2) .AND. LM(2)
133: FLOP = XX
134: RETURN
135: END
136: SUBROUTINE XCHAR(NAME,K)
137: INTEGER NAME(1),K
138: C
139: C SYSTEM DEPENDENT ROUTINE TO HANDLE SPECIAL CHARACTERS
140: C
141: LOGICAL NAML(2),LL
142: DOUBLE PRECISION NAM8
143: EQUIVALENCE (NAML(1),NAM8),(L,LL)
144: DATA IXCHAR /1H!/
145: IF( NAME(1) .NE. IXCHAR ) WRITE(6,30) NAME(1)
146: 30 FORMAT(1X,A1,' is not a MATLAB character.')
147: IF( NAME(1) .NE. IXCHAR ) RETURN
148: DO 5 I = 2,9
149: NAME(I-1) = NAME(I)
150: 5 CONTINUE
151: K1 = 2**24
152: K2 = 2**30
153: K3 = 2**7
154: DO 10 I = 1,8
155: IF( NAME(I) .GT. 0 ) NAME(I) = NAME(I)/K1
156: IF( NAME(I) .LT. 0 ) NAME(I) = ((NAME(I)+K2)+K2)/K1+K3
157: 10 CONTINUE
158: NAM8 = 0.0D0
159: DO 20 I = 1,4
160: L = K1*NAME(I)
161: NAML(1) = NAML(1) .OR. LL
162: L = K1*NAME(I+4)
163: NAML(2) = NAML(2) .OR. LL
164: K1 = K1/256
165: 20 CONTINUE
166: CALL CMSCMD(IRTURN,NAM8)
167: K = 99
168: RETURN
169: END
170: SUBROUTINE USER(A,M,N,S,T)
171: DOUBLE PRECISION A(M,N),S,T
172: C
173: INTEGER A3(9)
174: DATA A3 /-149,537,-27,-50,180,-9,-154,546,-25/
175: IF (A(1,1) .NE. 3.0D0) RETURN
176: DO 10 I = 1, 9
177: A(I,1) = A3(I)
178: 10 CONTINUE
179: M = 3
180: N = 3
181: RETURN
182: END
183: SUBROUTINE PROMPT(PAUSE)
184: INTEGER PAUSE
185: C
186: C ISSUE MATLAB PROMPT WITH OPTIONAL PAUSE
187: C
188: INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),RIO,WIO,RTE,WTE,HIO
189: COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,RIO,WIO,RTE,WTE,HIO
190: WRITE(WTE,10)
191: IF (WIO .NE. 0) WRITE(WIO,10)
192: 10 FORMAT(/1X,'<>')
193: IF (PAUSE .EQ. 1) READ(RTE,20) DUMMY
194: 20 FORMAT(A1)
195: RETURN
196: END
197: SUBROUTINE PLOT(LUNIT,X,Y,N,P,K,BUF)
198: DOUBLE PRECISION X(N),Y(N),P(1)
199: INTEGER BUF(79)
200: C
201: C PLOT X VS. Y ON LUNIT
202: C IF K IS NONZERO, THEN P(1),...,P(K) ARE EXTRA PARAMETERS
203: C BUF IS WORK SPACE
204: C
205: DOUBLE PRECISION XMIN,YMIN,XMAX,YMAX,DY,DX,Y1,Y0
206: INTEGER AST,BLANK,H,W
207: DATA AST/1H*/,BLANK/1H /,H/20/,W/79/
208: C
209: C H = HEIGHT, W = WIDTH
210: C
211: XMIN = X(1)
212: XMAX = X(1)
213: YMIN = Y(1)
214: YMAX = Y(1)
215: DO 10 I = 1, N
216: XMIN = DMIN1(XMIN,X(I))
217: XMAX = DMAX1(XMAX,X(I))
218: YMIN = DMIN1(YMIN,Y(I))
219: YMAX = DMAX1(YMAX,Y(I))
220: 10 CONTINUE
221: DX = XMAX - XMIN
222: IF (DX .EQ. 0.0D0) DX = 1.0D0
223: DY = YMAX - YMIN
224: WRITE(LUNIT,35)
225: DO 40 L = 1, H
226: DO 20 J = 1, W
227: BUF(J) = BLANK
228: 20 CONTINUE
229: Y1 = YMIN + (H-L+1)*DY/H
230: Y0 = YMIN + (H-L)*DY/H
231: JMAX = 1
232: DO 30 I = 1, N
233: IF (Y(I) .GT. Y1) GO TO 30
234: IF (L.NE.H .AND. Y(I).LE.Y0) GO TO 30
235: J = 1 + (W-1)*(X(I) - XMIN)/DX
236: BUF(J) = AST
237: JMAX = MAX0(JMAX,J)
238: 30 CONTINUE
239: WRITE(LUNIT,35) (BUF(J),J=1,JMAX)
240: 35 FORMAT(1X,79A1)
241: 40 CONTINUE
242: RETURN
243: END
244: SUBROUTINE EDIT(BUF,N)
245: INTEGER BUF(N)
246: C
247: C CALLED AFTER INPUT OF A SINGLE BACKSLASH
248: C BUF CONTAINS PREVIOUS INPUT LINE, ONE CHAR PER WORD
249: C ENTER LOCAL EDITOR IF AVAILABLE
250: C OTHERWISE JUST
251: RETURN
252: END
253:
254: TITLE 'CMSCMD: INTERFACE TO EXECUTE A CMS COMMAND:: 6/13/79'
255: ***********************************************************************
256: *
257: * COMMENTS TO JACK DONGARRA APPLIED MATHEMATICS DIVISION
258: * ARGONNE NATIONAL LABORATORY. D-247, EXT 7246
259: *
260: * CMSCMD WILL EXECUTE A CMS COMMAND WHEN CALLED FROM FORTRAN.
261: *
262: * THE CALLING SEQUENCE IS:
263: * CALL CMSCMD(IRET,'COMMAND ','ARG1 ',ARG2',.....,'ARGN')
264: *
265: * WHERE <IRET> IS INTEGER*4, THE RETURN CODE FROM <CMSCMD>.
266: * IRET CONTAINS THE RETURN CODE FROM THE CMS COMMAND,
267: * UNLESS MORE THAN 30 <ARG> FIELDS WHERE PASSED,
268: * WHEN IT WILL BE -31.
269: *
270: * ALL THE REMAINING ARGUMENTS MUST BE LITERALS. THEY MUST
271: * NOT CONTAIN LEADING OR EMBEDDED SPACES. IF LESS THAN 8
272: * CHARACTERS LONG THEY SHOULD HAVE AT LEAST 1 TRAILING SPACE.
273: * COMPILERS PAD LITERALS DIFFERENTLY, SO IT IS SAFEST TO
274: * ALWAYS APPEND A TRAILING SPACE NO MATTER WHAT THE LENGTH
275: * OF THE LITERAL. FOR SOME COMPILERS <CMSCMD> WILL WORK
276: * CORRECTLY WITHOUT TRAILING SPACES. THE ARGUMENTS MAY, OF
277: * COURSE, BE ARRAYS OF TYPE "LOGICAL".
278: *
279: * <COMMAND> IS THE NAME OF THE CMS COMMAND TO BE EXECUTED.
280: *
281: * <ARG1>
282: * TO
283: * <ARGN> ARE THE ARGUMENTS TO BE PASSED TO THE CMS COMMAND.
284: * UP TO 30 SUCH ARGUMENTS MAY BE PASSED.
285: * NOTE THAT SINCE CMS DOES NOT DO ANY FURTHER
286: * TOKENIZATION AN ARGUMENT CONSISTING SOLELY OF SPACES
287: * WILL HAVE A NULL VALUE.
288: *
289: ***********************************************************************
290: SPACE 3
291: CMSCMD CSECT 0
292: USING *,15
293: B SAVEREGS
294: DC AL1(6)
295: DC C'CMSCMD'
296: SAVEREGS STM 14,12,12(13) SAVE CALLERS REGS IN OWN SAVE AREA
297: ST 13,SAVEAREA+4 STORE CHAIN BACK ADDRESS
298: LR 12,13
299: LA 13,SAVEAREA
300: ST 13,8(12)
301: DROP 15
302: BALR 10,0 ESTABLISH BASE REG
303: USING *,10
304: LA 4,ARGLIST-8 R4->CMS ARG LIST
305: L 5,=F'-31' -31 IS RETURN CODE FOR BAD ARGS
306: * R1 CONTAINS ADDRESS OF LIST OF CALLING ARG ADDRESSES
307: L 2,0(0,1) R2 CONTAINS ADDR OF RETURN CODE (ARG1)
308: SR 3,3 R3 IS CALLING ARG COUNTER...SET TO ZERO
309: NEXTARG LA 4,8(0,4) STEP R4 TO NEXT CMS ARG
310: CLI 0(1),X'80' WAS THIS FLAGGED AS LAST ARG?
311: BE GOCMS YES..GO AND CALL CMS ROUTINE
312: LA 1,4(0,1) NO...STEP CALLING ARG PTR
313: LA 3,1(0,3) INCREMENT ARG COUNTER
314: C 3,VAL31 >31?
315: BH EXIT YES..LEAVE WITH RETURN CODE = -31
316: MVC 0(8,4),BLANKS NO...BLANK OUT CMS ARG
317: LA 6,8(0,0) SET R6=8 FOR COUNT OF 8 BYTES
318: L 7,0(0,1) R7->CALLING ARG STRING
319: LR 8,4 R8->CMS ARG STRING
320: COPYLOOP CLI 0(7),X'00' NULL BYTE?
321: BE NEXTARG YES..END OF STRING
322: CLI 0(7),X'40' NO...IS IT A SPACE?
323: BE NEXTARG YES..END OF STRING
324: MVC 0(1,8),0(7) NO...COPY BYTE
325: LA 7,1(0,7) INCREMENT R7, R8
326: LA 8,1(0,8)
327: BCT 6,COPYLOOP
328: B NEXTARG
329: GOCMS MVC 0(8,4),NULLARG SET TRAILING NULL ARG FOR CMS
330: SR 5,5 HOPE FOR SUCCESS...RETURN CODE=0
331: LA 1,ARGLIST
332: SVC 202
333: DC AL4(ERROR)
334: B EXIT
335: ERROR LR 5,15 PICK UP CMS RETURN CODE
336: EXIT ST 5,0(0,2) PASS BACK RETURN CODE
337: L 13,4(13) RESTORE CALLER SAVEAREA PTR
338: LM 14,12,12(13) RESTORE CALLERS REGS
339: BR 14 AND RETURN
340: SPACE 5
341: NULLARG DC 8X'FF'
342: BLANKS DC CL8' '
343: ARGLIST DS 32D FOR COMMAND NAME, PLUS UP TO 30 ARGS,
344: * AND TRAILING NULL ARG EXPECTED BY CMS
345: VAL31 DC F'31'
346: SAVEAREA DS 24F
347: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.