|
|
1.1 ! root 1: .ds xl MATLAB Installation ! 2: .hy 0 ! 3: .de pp ! 4: .sp ! 5: .ti +5 ! 6: .. ! 7: .de hd ! 8: 'sp 2 ! 9: .if \\n%-1 'tl '\*(xl, page %' ! 10: .if !\\n%-1 'tl '\n(mo/\n(dy/\n(yr' ! 11: 'sp 3 ! 12: 'ns ! 13: .. ! 14: .de fo ! 15: 'bp ! 16: .. ! 17: .wh 0 hd ! 18: .wh -7 fo ! 19: \ ! 20: .sp 3 ! 21: .ce 2 ! 22: MATLAB Installation Guide ! 23: November, 1983 ! 24: .sp 2 ! 25: .ce 3 ! 26: Cleve Moler ! 27: Department of Computer Science ! 28: University of New Mexico ! 29: .sp 2 ! 30: .pp ! 31: The MATLAB tape is usually in one of two formats -- a UNIX "tar" tape, ! 32: or a "generic" tape with the following parameters: ! 33: ! 34: 9 track ! 35: 1600 bits per inch ! 36: no label ! 37: 80 characters per record ! 38: 1600 characters per block ! 39: 18 files in ASCII, followed by 18 files in EBCDIC ! 40: .pp ! 41: There are 36 files on the generic tape. The names of the first 18, and their ! 42: approximate sizes, are: ! 43: ! 44: 1. INSTALL 1100 lines ! 45: 2. MAT 3900 lines ! 46: 3. LIB 3339 lines ! 47: 4. HELPER.66 75 lines ! 48: 5. HELPER.77 120 lines ! 49: 6. HELP 750 lines ! 50: 7. SYS.UNIX 900 lines ! 51: 8. SYS.VMS 260 lines ! 52: 9. SYS.TSO 200 lines ! 53: 10. SYS.CMS 350 lines ! 54: 11. SYS.DEC10 250 lines ! 55: 12. SYS.CDC 200 lines ! 56: 13. SYS.PRIME 350 lines ! 57: 14. DOC 3960 lines ! 58: 15. DEMO 21 lines ! 59: 16. DOC.NROFF 3250 lines ! 60: 17. MAT.SNGL 3850 lines ! 61: 18. LIB.SNGL 3339 lines ! 62: ! 63: where a line is one 80 character record. ! 64: .pp ! 65: The first 18 files are in the ASCII character set. ! 66: The remaining 18 files are copies of the first 18 in EBCDIC. ! 67: .pp ! 68: INSTALL is this document. You can skip over it if you have this hard copy. ! 69: .pp ! 70: MAT, LIB, one of the versions of HELPER and one of the versions of SYS ! 71: together constitute the complete source code for the ! 72: double precision version of MATLAB. ! 73: .pp ! 74: The subroutines in MAT make up the parser and interpreter. ! 75: They include a COMMON statement which can be ! 76: changed to change the amount of memory allocated to variables. ! 77: .pp ! 78: The subroutines in LIB include modified versions of ! 79: the necessary routines from LINPACK, EISPACK and the BLAS. ! 80: These do not contain any COMMON statements and do not have to be ! 81: changed if the size of the stack is changed. ! 82: .pp ! 83: There are two versions of HELPER, the subroutine ! 84: which manages the help facility. ! 85: The version in HELPER.66 is written in Fortran 66 and ! 86: uses sequential i/o. ! 87: The version in HELPER.77 is written in Fortran 77 and uses ! 88: character variables and direct access i/o. ! 89: If your system supports ! 90: both versions, you will probably want to choose the direct access one -- ! 91: it should be much faster. ! 92: If you choose the direct access version, you will have to run ! 93: a preprocessor named HELPSET, which is also in file HELPER.77. ! 94: .pp ! 95: HELP is the source text for the help facility. It is read by the ! 96: sequential version of HELPER, or preprocessed by HELPSET into two files which ! 97: are then read by the direct access version of HELPER. HELP is also included as ! 98: an appendix in the User's Guide. ! 99: .pp ! 100: The subroutines in one of the versions of SYS ! 101: may have to be modified for your particular ! 102: operating system. They involve file access and floating point word format. ! 103: I have included versions that should work on several different ! 104: operating systems. Pick the version that is closest to your own ! 105: system and make any changes you need. ! 106: There are no machine dependent constants. ! 107: .pp ! 108: DOC is a report entitled "MATLAB Users' Guide". ! 109: It should be printed on a nice printer with upper and lower case; ! 110: there are 66 lines per page. ! 111: Make as many copies as you need, or order copies from us at New Mexico. ! 112: .pp ! 113: DEMO contains a demonstration exec file which can be accessed ! 114: by the exec command in MATLAB. ! 115: On most systems, all that is required is ! 116: EXEC('DEMO') or EXEC('DEMO',7). ! 117: On some systems, like TSO and NOS, it will be necessary ! 118: to attach file DEMO to unit 2 and then EXEC(2) or EXEC(2,7). ! 119: .pp ! 120: DOC.NROFF is the input to the UNIX text processing system ! 121: that was used to produce DOC. This may be useful if you want ! 122: to print the users' guide in a different format. ! 123: .pp ! 124: MAT.SNGL and LIB.SNGL are the single precision versions of MAT and LIB. ! 125: It is suggested that these be used only on systems with long words ! 126: (48 bit floating point fraction) or small memories. ! 127: .pp ! 128: The first thing to worry about is the character set. ! 129: The use of an upper-lower case character set is highly desirable, ! 130: but not essential. ! 131: Read the tape ! 132: and look at the first 50 or so lines of MAT. ! 133: This is the subroutine MATLAB, a listing ! 134: of which is included in this document. ! 135: Check the comments near the beginning to see if the special characters ! 136: are ok. The ones we have had trouble with include: ! 137: SEMI ; BSLASH \\ COLON : LESS < GREAT > ! 138: .br ! 139: Any characters which are not ok should be changed in the comment and ! 140: in the data statement which follows. ! 141: The alternate character set includes the lower case letters as well ! 142: as substitutes for some of the special characters, such as \\ and :, ! 143: which are not on some terminals. ! 144: Do not worry too much about the alternate character set now. ! 145: These data statements in subroutine MATLAB are the only place in the ! 146: source code where the special characters occur. ! 147: (If you want to get fancy, there is a data statement involving BEL ! 148: in subroutine ERROR near the end of file MAT. ! 149: Change 1H-blank to 1H-control G to get your terminal to ring its ! 150: bell for any error.) ! 151: .pp ! 152: The files DOC and HELP are full of special characters, including ! 153: < > [ ] : ; \\ | ! 154: .br ! 155: If they are not ok, I hope it is not too difficult to fix them up. ! 156: .pp ! 157: I have used several FORTRAN constructions which are only semi-standard, ! 158: and which may have to be changed for some systems: ! 159: Single quote (') in FORMATS instead of a tribute to Hollerith. ! 160: Entire arrays initialized in DATA statements. ! 161: Use of END= in READ statements. ! 162: .br ! 163: I have not asked PFORT to tell me what else is non-standard. ! 164: .pp ! 165: Some interactive FORTRAN systems use column 1 for carriage control and ! 166: others don't. If your system does not, edit file MAT and delete ! 167: all "1X," . There are 131 occurrences. ! 168: .pp ! 169: The main program in file SYS simply calls MATLAB. ! 170: It may have to be modified to control the printing of ! 171: underflow and overflow messages. ! 172: The ground rules are: Underflows are possible, but are harmless if ! 173: they are quietly set to zero. ! 174: Overflows are error conditions. It would be nice to print a message ! 175: and continue. ! 176: .pp ! 177: A listing of a typical version of SYS, ! 178: using some Fortran 77 for clarity, is included in this document. ! 179: I hope it is fairly easy to see what the various subroutines ! 180: do and how they have to be revised for your system. ! 181: Please send me copies of versions appropriate for your system. ! 182: .pp ! 183: The amount of memory required can be altered by a global text edit on MAT ! 184: which changes the matrix element stack length from ! 185: 5005 to something else. Be sure to get the statement ! 186: VSIZE = 5005 ! 187: .br ! 188: in the subroutine MATLAB. ! 189: With this setting of the stack length, MATLAB requires about a 300K byte ! 190: region on an IBM system. ! 191: The length has to be reduced somewhat to get MATLAB to fit ! 192: into a 64K word region on a CDC system. ! 193: Since each matrix element occupies two double or single precision words, ! 194: an increase of 1000 in the stack length requires an additional ! 195: 16K bytes or 2000 words. ! 196: .pp ! 197: It is possible to get by with less memory if you use overlays. ! 198: The simplest way to do this is the following. ! 199: ! 200: .ne 5 ! 201: ROOT ! 202: | ! 203: ------------------------------- ! 204: | | | | | | ! 205: S0 S1 S2 S3 S4 S5 ! 206: ! 207: Only ROOT plus one of the segments S0 through S5 need be in ! 208: memory at any one time. The segments do not call each other, ! 209: but return to the root. All the relevant calls are near the end ! 210: of subroutine MATLAB in the root. ! 211: There are five labeled COMMON blocks which are shared by the ! 212: root and all the segments. ! 213: The various segments consist of: ! 214: ! 215: .ne 7 ! 216: ROOT: ! 217: MAIN MATLAB STACK1 ! 218: PRINT PRNTID FUNS ! 219: STACKP ERROR FILES ! 220: HELPER PYTHAG FORMZ ! 221: FLOP PROMPT ! 222: Plus everything in file LIB not mentioned below. ! 223: ! 224: .ne 6 ! 225: S0: ! 226: PARSE COMAND CLAUSE ! 227: EXPR TERM FACTOR ! 228: STACKG STACK2 GETSYM ! 229: GETLIN GETCH GETVAL ! 230: EDIT XCHAR ! 231: ! 232: .ne 4 ! 233: S1: ! 234: MATFN1 WGECO WGEFA ! 235: WGESL WGEDI WPOFA ! 236: RREF HILBER ! 237: ! 238: .ne 3 ! 239: S2: ! 240: MATFN2 CORTH COMQR3 ! 241: HTRIDI HTRIBK IMTQL2 ! 242: ! 243: .ne 2 ! 244: S3: ! 245: MATFN3 WSVDC ! 246: ! 247: .ne 2 ! 248: S4: ! 249: MATFN4 WQRDC WQRSL ! 250: ! 251: .ne 4 ! 252: S5: ! 253: MATFN5 MATFN6 MAGIC ! 254: SAVLOD RAT USER ! 255: PLOT ! 256: ! 257: If you have enough room, combine ROOT and S0. ! 258: With more room, combine ROOT, S0 and S5. ! 259: If you use some overlay structure, please send me a description of ! 260: how it is done on your system. ! 261: .pp ! 262: In case anybody needs to know, here are the changes necessary ! 263: to convert from double to single precision. They can all be ! 264: safely accomplished by simple global text changes in MAT, LIB ! 265: and an appropriate version of SYS. ! 266: ! 267: DOUBLE PRECISION REAL ! 268: DOUBLE- REAL- ! 269: DSQRT SQRT ! 270: DLOG ALOG ! 271: DEXP EXP ! 272: DSIN SIN ! 273: DCOS COS ! 274: DATAN ATAN ! 275: DABS ABS ! 276: DMAX1 AMAX1 ! 277: DMIN1 AMIN1 ! 278: IDINT IFIX ! 279: DSIGN SIGN ! 280: DMOD AMOD ! 281: D0 E0 ! 282: D1 E1 ! 283: D2 E2 ! 284: D9 E9 ! 285: ! 286: .pp ! 287: Here are some additional comments that apply to individual systems. ! 288: .sp 2 ! 289: VAX UNIX. ! 290: .pp ! 291: If you have read the "tar" format tape, see file README and ! 292: the makefile. Ignore the rest of this section. ! 293: .pp ! 294: It is essential to change the single backslash \\ in the data ! 295: statement near the beginning of file MAT to a double backslash \\\\. ! 296: If this is not done, the F77 compiler produces an obscure error message ! 297: about "dataalpha" being too long. ! 298: .pp ! 299: Increase the size of the stack to take advantage of the virtual memory. ! 300: Eliminate all the "1X," in formats. ! 301: Change the statement ! 302: CASE = 0 in MATLAB to CASE = 1 to get lower case file names. ! 303: All these changes can be accomplished ! 304: by applying the following ed or vi commands to file MAT. ! 305: ! 306: 1,$s/\\/\\\\/g ! 307: 1,$s/5005/50005/g ! 308: 1,$s/1X,/0X,/g ! 309: 1,$s/CASE = 0/CASE = 1/ ! 310: 1,$s/BEL\/1H /BEL\/1H^G/ ! 311: 1,$s/LCT(2) = 25/LCT(2) = 25000/ ! 312: .pp ! 313: The compilation should suppress warnings about initializing non-character ! 314: variables with Hollerith and should use the Berkeley version of the ! 315: i/o support routines. This can be accomplished with: ! 316: ! 317: % f77 -w66 mat.f lib.f helper.f sys.f -lI77uc ! 318: .pp ! 319: Gary Klimowicz and Lee Ward of UNM have developed a overflow fault handler ! 320: for use with VAX UNIX. A copy of their C program in included in SYS.UNIX ! 321: and on the "tar" tape. ! 322: .sp 3 ! 323: VAX VMS ! 324: .pp ! 325: SYS.VMS contains an extra subroutine for proper handling of floating ! 326: point overflow. The main program includes a call to the system ! 327: which initializes this handling. ! 328: .pp ! 329: Integer overflow is expected in the the print routine and in ! 330: random number generator. ! 331: The integer overflow messages can be turned off by ! 332: ! 333: FORTRAN/NOCHECK MAT.FOR,LIB.FOR ! 334: .sp 3 ! 335: IBM (TSO) ! 336: .br ! 337: (Thanks to Jack Dongarra at Argonne.) ! 338: .pp ! 339: The main program in SYS.TSO includes the appropriate calls ! 340: to the IBM system utility ERRSET that turns off verbose ! 341: underflow and overflow messages. ! 342: .pp ! 343: Unfortunately, TSO does not have a mechanism for opening ! 344: files during execution. It is necessary to use file numbers with SAVE, ! 345: LOAD and EXEC. ! 346: .pp ! 347: We have to specify LRECL=80 for terminal input ! 348: on unit 5 to get blanks added to input lines. It is a good ! 349: idea to set up a clist something like the following. ! 350: ! 351: FREE FILE(FT05F001 FT06F001 FT09F001 FT01F001 FT02F001) ! 352: FREE ATTRLIST(AT80) ! 353: ATTR AT80 LRECL(80) BLKSIZE(80) RECFM(F) ! 354: ALLOC FILE(FT05F001) DA(*) USING(AT80) ! 355: ALLOC FILE(FT06F001) DA(*) ! 356: ALLOC FILE(FT09F001) DA('MATLAB.HELP.DATA') ! 357: ALLOC FILE(FT01F001) DA(SAVLOD.DATA) ! 358: ALLOC FILE(FT02F001) DA('MATLAB.DEMO.DATA') ! 359: CALL 'MATLAB.LOAD(MATMOD)' ! 360: ! 361: With this arrangement, the DEMO file can be executed by exec(2). ! 362: .sp 3 ! 363: IBM (CMS) ! 364: .br ! 365: (Thanks to Jack Dongarra at Argonne and David Gay at MIT.) ! 366: .pp ! 367: Entering a blank line in response to the MATLAB prompt generates ! 368: an end-of-file from terminal input (Fortran unit FT05F001). ! 369: This results in a call from GETLIN to FILES with LUNIT = -5. ! 370: The terminal is "rewound" and control eventually returned to PARSE ! 371: which prints another prompt. I hope this works. ! 372: .pp ! 373: An assembly language routine used to attach files with names generated ! 374: by MATLAB to Fortran unit numbers is included in SYS.CMS. ! 375: .sp 3 ! 376: DEC-10 ! 377: .br ! 378: (Thanks to Stan Eisenstat and Craig Douglas at Yale.) ! 379: .pp ! 380: The hyperbolic trig functions SINH and COSH are not available ! 381: on the DEC system. Fortran subroutines are included in the SYS.DEC10 file. ! 382: .sp 3 ! 383: PRIME 400 ! 384: .br ! 385: (Thanks to Richard Franke and Drexel University.) ! 386: .pp ! 387: The terminal is Fortran I/O unit number 1. ! 388: Subroutine MATLAB has to be changed so that ! 389: RTE = 5 becomes RTE = 1 ! 390: WTE = 6 becomes WTE = 1 ! 391: .br ! 392: Subroutine MATFN5 has to be changed so that ! 393: WIO = 1 becomes WIO = 8 ! 394: LUNIT = 1 becomes LUNIT = 8 (in two places). ! 395: .sp 3 ! 396: CDC ! 397: .pp ! 398: CDC systems offer exciting challenges as far as portability is concerned. ! 399: The first question is: which character set should be used? ! 400: An easy approach is to convert everything to the venerable 6-bit character set. ! 401: Even so, you may have trouble ! 402: with the colon, which is a pretty important MATLAB character. ! 403: It is far more fun to try to use upper and lower case and all ! 404: the special symbols. ! 405: I have succeeded in doing this ! 406: with the 6/12-bit setup used on the NOS system at Sandia, ! 407: but have given up with the 6/18-bit coding on LTSS at Los Alamos. ! 408: .pp ! 409: In "ASCII" mode on NOS, lower case characters are represented by ! 410: 12 bits -- the first 6 bits are octal 76 and the last 6 are the ! 411: corresponding upper case character. They count as two characters. ! 412: So, the following changes are required in file MAT. Several of ! 413: the mixed case strings in FORMAT statements extend beyond ! 414: column 72. You might as well convert these to all upper case. ! 415: All the 80A1's in FORMATS should be changed to 132A1's and ! 416: all the DATA statements initializing LRECL should be changed from 80 to 132. ! 417: The DATA statement for ALPHB in subroutine MATLAB can be changed to ! 418: have all upper case alphabetic characters because subroutine XCHAR ! 419: will catch the prefix octal 76. ! 420: .pp ! 421: An important change involves our friend the colon, which becomes ! 422: a 12-bit octal 7404. In the DATA statement for ALPHA, make the ! 423: element just before 1H+ into a 1H(percent sign). ! 424: And, in the DATA statement for ALPHB, make the corresponding element ! 425: into a 2H(colon). ! 426: Then read the comments in subroutine XCHAR in file SYS.CDC and make ! 427: sure that the DATA statements there are correct. ! 428: .pp ! 429: The FTN5 compiler should take MATLAB pretty much is it is. ! 430: The older FTN compiler requires two familiar changes to the ! 431: entire source code. First, the END= in the READ statements have ! 432: to be replaced by IF (EOF) GO TO ... . ! 433: Second, the single quotes in FORMATS have to be replaced with ! 434: asterisks. ! 435: .sp 3 ! 436: Good luck. Please let me know what difficulties you have, and what ! 437: I have left out of this guide. You can call me at: ! 438: 505-268-8631 (home) ! 439: 505-277-3112 (office) ! 440: ! 441: ------------ ! 442: .pp ! 443: The support of the National Science Foundation and the use of ! 444: facilities at Argonne National Laboratory, Los Alamos National Laboratory ! 445: and Stanford Linear Accelerator Center is gratefully acknowledged. ! 446: So is the assistance of the many people who have installed early ! 447: versions of MATLAB. ! 448: .bp ! 449: .ll 80 ! 450: .nf ! 451: Contents of file MAT: ! 452: ! 453: SUBROUTINE MATLAB(INIT) ! 454: SUBROUTINE PARSE ! 455: SUBROUTINE COMAND(ID) ! 456: SUBROUTINE CLAUSE ! 457: SUBROUTINE EXPR ! 458: SUBROUTINE TERM ! 459: SUBROUTINE FACTOR ! 460: SUBROUTINE FUNS(ID) ! 461: SUBROUTINE STACKP(ID) ! 462: SUBROUTINE STACKG(ID) ! 463: SUBROUTINE STACK1(OP) ! 464: SUBROUTINE STACK2(OP) ! 465: SUBROUTINE PRINT(ID,K) ! 466: SUBROUTINE PRNTID(ID,ARGCNT) ! 467: SUBROUTINE GETSYM ! 468: SUBROUTINE GETLIN ! 469: SUBROUTINE GETCH ! 470: SUBROUTINE GETVAL(S) ! 471: SUBROUTINE MATFN1 ! 472: SUBROUTINE MATFN2 ! 473: SUBROUTINE MATFN3 ! 474: SUBROUTINE MATFN4 ! 475: SUBROUTINE MATFN5 ! 476: SUBROUTINE MATFN6 ! 477: SUBROUTINE ERROR(N) ! 478: DOUBLE PRECISION FUNCTION PYTHAG(A,B) ! 479: SUBROUTINE RAT(X,LEN,MAXD,D) ! 480: ! 481: Contents of file HELPER.66: ! 482: ! 483: SUBROUTINE HELPER(H) -- Sequential version ! 484: ! 485: Contents of file HELPER.77: ! 486: ! 487: PROGRAM HLPSET -- Direct access setup ! 488: SUBROUTINE HELPER(H) -- Direct access version ! 489: ! 490: Contents of file SYS: ! 491: ! 492: PROGRAM MAIN ! 493: SUBROUTINE FILES(LUNIT,NAME) ! 494: SUBROUTINE SAVLOD(LUNIT,ID,M,N,IMG,JOB,XREAL,XIMAG) ! 495: SUBROUTINE FORMZ(LUNIT,X,Y) ! 496: DOUBLE PRECISION FUNCTION FLOP(X) ! 497: SUBROUTINE XCHAR(BUF,K) ! 498: SUBROUTINE USER(A,M,N,S,T) ! 499: SUBROUTINE PROMPT(PAUSE) ! 500: SUBROUTINE PLOT(LUNIT,X,Y,N,P,K,BUF) ! 501: SUBROUTINE EDIT(BUF,N) ! 502: .bp ! 503: Contents of file LIB: ! 504: ! 505: SUBROUTINE WGECO(AR,AI,LDA,N,IPVT,RCOND,ZR,ZI) ! 506: SUBROUTINE WGEFA(AR,AI,LDA,N,IPVT,INFO) ! 507: SUBROUTINE WGESL(AR,AI,LDA,N,IPVT,BR,BI,JOB) ! 508: SUBROUTINE WGEDI(AR,AI,LDA,N,IPVT,DETR,DETI,WORKR,WORKI,JOB) ! 509: SUBROUTINE WPOFA(AR,AI,LDA,N,INFO) ! 510: SUBROUTINE RREF(AR,AI,LDA,M,N,EPS) ! 511: SUBROUTINE HILBER(A,LDA,N) ! 512: SUBROUTINE HTRIDI(NM,N,AR,AI,D,E,E2,TAU) ! 513: SUBROUTINE HTRIBK(NM,N,AR,AI,TAU,M,ZR,ZI) ! 514: SUBROUTINE IMTQL2(NM,N,D,E,Z,IERR,JOB) ! 515: SUBROUTINE CORTH(NM,N,LOW,IGH,AR,AI,ORTR,ORTI) ! 516: SUBROUTINE COMQR3(NM,N,LOW,IGH,ORTR,ORTI,HR,HI,WR,WI,ZR,ZI,IERR ! 517: SUBROUTINE WSVDC(XR,XI,LDX,N,P,SR,SI,ER,EI,UR,UI,LDU,VR,VI,LDV, ! 518: SUBROUTINE WQRDC(XR,XI,LDX,N,P,QRAUXR,QRAUXI,JPVT,WORKR,WORKI, ! 519: SUBROUTINE WQRSL(XR,XI,LDX,N,K,QRAUXR,QRAUXI,YR,YI,QYR,QYI,QTYR, ! 520: SUBROUTINE MAGIC(A,LDA,N) ! 521: SUBROUTINE BASE(X,B,EPS,S,N) ! 522: DOUBLE PRECISION FUNCTION URAND(IY) ! 523: SUBROUTINE WMUL(AR,AI,BR,BI,CR,CI) ! 524: SUBROUTINE WDIV(AR,AI,BR,BI,CR,CI) ! 525: SUBROUTINE WSIGN(XR,XI,YR,YI,ZR,ZI) ! 526: SUBROUTINE WSQRT(XR,XI,YR,YI) ! 527: SUBROUTINE WLOG(XR,XI,YR,YI) ! 528: SUBROUTINE WATAN(XR,XI,YR,YI) ! 529: DOUBLE PRECISION FUNCTION WNRM2(N,XR,XI,INCX) ! 530: DOUBLE PRECISION FUNCTION WASUM(N,XR,XI,INCX) ! 531: INTEGER FUNCTION IWAMAX(N,XR,XI,INCX) ! 532: SUBROUTINE WRSCAL(N,S,XR,XI,INCX) ! 533: SUBROUTINE WSCAL(N,SR,SI,XR,XI,INCX) ! 534: SUBROUTINE WAXPY(N,SR,SI,XR,XI,INCX,YR,YI,INCY) ! 535: DOUBLE PRECISION FUNCTION WDOTUR(N,XR,XI,INCX,YR,YI,INCY) ! 536: DOUBLE PRECISION FUNCTION WDOTUI(N,XR,XI,INCX,YR,YI,INCY) ! 537: DOUBLE PRECISION FUNCTION WDOTCR(N,XR,XI,INCX,YR,YI,INCY) ! 538: DOUBLE PRECISION FUNCTION WDOTCI(N,XR,XI,INCX,YR,YI,INCY) ! 539: SUBROUTINE WCOPY(N,XR,XI,INCX,YR,YI,INCY) ! 540: SUBROUTINE WSET(N,XR,XI,YR,YI,INCY) ! 541: SUBROUTINE WSWAP(N,XR,XI,INCX,YR,YI,INCY) ! 542: SUBROUTINE RSET(N,DX,DY,INCY) ! 543: SUBROUTINE RSWAP(N,X,INCX,Y,INCY) ! 544: SUBROUTINE RROT(N,DX,INCX,DY,INCY,C,S) ! 545: SUBROUTINE RROTG(DA,DB,C,S) ! 546: LOGICAL FUNCTION EQID(X,Y) ! 547: SUBROUTINE PUTID(X,Y) ! 548: DOUBLE PRECISION FUNCTION ROUND(X) ! 549: .bp ! 550: First subroutine in file MAT: ! 551: ! 552: SUBROUTINE MATLAB(INIT) ! 553: C INIT = 0 FOR ORDINARY FIRST ENTRY ! 554: C = POSITIVE FOR SUBSEQUENT ENTRIES ! 555: C = NEGATIVE FOR SILENT INITIALIZATION (SEE MATZ) ! 556: C ! 557: DOUBLE PRECISION STKR(5005),STKI(5005) ! 558: INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP ! 559: INTEGER ALFA(52),ALFB(52),ALFL,CASE ! 560: INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ ! 561: INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),RIO,WIO,RTE,WTE,HIO ! 562: INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2) ! 563: COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP ! 564: COMMON /ALFS/ ALFA,ALFB,ALFL,CASE ! 565: COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ ! 566: COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,RIO,WIO,RTE,WTE,HIO ! 567: COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN ! 568: C ! 569: DOUBLE PRECISION S,T ! 570: INTEGER EPS(4),FLOPS(4),EYE(4),RAND(4) ! 571: C ! 572: C CHARACTER SET ! 573: C 0 10 20 30 40 50 ! 574: C ! 575: C 0 0 A K U COLON : LESS < ! 576: C 1 1 B L V PLUS + GREAT > ! 577: C 2 2 C M W MINUS - ! 578: C 3 3 D N X STAR * ! 579: C 4 4 E O Y SLASH / ! 580: C 5 5 F P Z BSLASH \\ ! 581: C 6 6 G Q BLANK EQUAL = ! 582: C 7 7 H R LPAREN ( DOT . ! 583: C 8 8 I S RPAREN ) COMMA , ! 584: C 9 9 J T SEMI ; QUOTE ' ! 585: C ! 586: INTEGER ALPHA(52),ALPHB(52) ! 587: DATA ALPHA /1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9, ! 588: $ 1HA,1HB,1HC,1HD,1HE,1HF,1HG,1HH,1HI,1HJ, ! 589: $ 1HK,1HL,1HM,1HN,1HO,1HP,1HQ,1HR,1HS,1HT, ! 590: $ 1HU,1HV,1HW,1HX,1HY,1HZ,1H ,1H(,1H),1H;, ! 591: $ 1H:,1H+,1H-,1H*,1H/,1H\\,1H=,1H.,1H,,1H', ! 592: $ 1H<,1H>/ ! 593: C ! 594: C ALTERNATE CHARACTER SET ! 595: C ! 596: DATA ALPHB /1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9, ! 597: $ 1Ha,1Hb,1Hc,1Hd,1He,1Hf,1Hg,1Hh,1Hi,1Hj, ! 598: $ 1Hk,1Hl,1Hm,1Hn,1Ho,1Hp,1Hq,1Hr,1Hs,1Ht, ! 599: $ 1Hu,1Hv,1Hw,1Hx,1Hy,1Hz,1H ,1H(,1H),1H;, ! 600: $ 1H|,1H+,1H-,1H*,1H/,1H$,1H=,1H.,1H,,1H", ! 601: $ 1H[,1H]/ ! 602: C ! 603: DATA EPS/14,25,28,36/,FLOPS/15,21,24,25/ ! 604: DATA EYE/14,34,14,36/,RAND/27,10,23,13/ ! 605: C ! 606: IF (INIT .GT. 0) GO TO 90 ! 607: C ! 608: C RTE = UNIT NUMBER FOR TERMINAL INPUT ! 609: C WTE = UNIT NUMBER FOR TERMINAL OUTPUT ! 610: C HIO = UNIT NUMBER FOR HELP FILE ! 611: RTE = 5 ! 612: WTE = 6 ! 613: HIO = 9 ! 614: C ! 615: IF (INIT .GE. 0) WRITE(WTE,100) ! 616: 100 FORMAT(//1X,' < M A T L A B >' ! 617: $ /1X,' Version of --/--/--') ! 618: C ! 619: C ASK HELPER TO OPEN HELP FILE ! 620: BUF(1) = 0 ! 621: CALL HELPER(BUF) ! 622: C ! 623: C RANDOM NUMBER SEED ! 624: RAN(1) = 0 ! 625: C ! 626: C INITIAL LINE LIMIT ! 627: LCT(2) = 25 ! 628: C ! 629: ALFL = 52 ! 630: CASE = 1 ! 631: C CASE = 1 for file names in lower case ! 632: DO 20 I = 1, ALFL ! 633: ALFA(I) = ALPHA(I) ! 634: ALFB(I) = ALPHB(I) ! 635: 20 CONTINUE ! 636: C ! 637: VSIZE = 50005 ! 638: LSIZE = 48 ! 639: PSIZE = 32 ! 640: BOT = LSIZE-3 ! 641: CALL WSET(5,0.0D0,0.0D0,STKR(VSIZE-4),STKI(VSIZE-4),1) ! 642: CALL PUTID(IDSTK(1,LSIZE-3),EPS) ! 643: LSTK(LSIZE-3) = VSIZE-4 ! 644: MSTK(LSIZE-3) = 1 ! 645: NSTK(LSIZE-3) = 1 ! 646: S = 1.0D0 ! 647: 30 S = S/2.0D0 ! 648: T = 1.0D0 + S ! 649: IF (T .GT. 1.0D0) GO TO 30 ! 650: STKR(VSIZE-4) = 2.0D0*S ! 651: CALL PUTID(IDSTK(1,LSIZE-2),FLOPS) ! 652: LSTK(LSIZE-2) = VSIZE-3 ! 653: MSTK(LSIZE-2) = 1 ! 654: NSTK(LSIZE-2) = 2 ! 655: CALL PUTID(IDSTK(1,LSIZE-1), EYE) ! 656: LSTK(LSIZE-1) = VSIZE-1 ! 657: MSTK(LSIZE-1) = -1 ! 658: NSTK(LSIZE-1) = -1 ! 659: STKR(VSIZE-1) = 1.0D0 ! 660: CALL PUTID(IDSTK(1,LSIZE), RAND) ! 661: LSTK(LSIZE) = VSIZE ! 662: MSTK(LSIZE) = 1 ! 663: NSTK(LSIZE) = 1 ! 664: FMT = 1 ! 665: FLP(1) = 0 ! 666: FLP(2) = 0 ! 667: DDT = 0 ! 668: RAN(2) = 0 ! 669: PTZ = 0 ! 670: PT = PTZ ! 671: ERR = 0 ! 672: RIO = RTE ! 673: WIO = 0 ! 674: IF (INIT .LT. 0) RETURN ! 675: C ! 676: 90 CALL PARSE ! 677: IF (FUN .EQ. 1) CALL MATFN1 ! 678: IF (FUN .EQ. 2) CALL MATFN2 ! 679: IF (FUN .EQ. 3) CALL MATFN3 ! 680: IF (FUN .EQ. 4) CALL MATFN4 ! 681: IF (FUN .EQ. 5) CALL MATFN5 ! 682: IF (FUN .EQ. 6) CALL MATFN6 ! 683: IF (FUN .EQ. 21) CALL MATFN1 ! 684: IF (FUN .NE. 99) GO TO 90 ! 685: RETURN ! 686: END ! 687: .bp ! 688: Typical file SYS (Nonstandard stuff in lower case): ! 689: ! 690: C PROGRAM MAIN ! 691: call overflow-control ! 692: CALL MATLAB(0) ! 693: STOP ! 694: END ! 695: ! 696: ! 697: SUBROUTINE FILES(LUNIT,NAME) ! 698: INTEGER LUNIT,NAME(32) ! 699: C ! 700: C SYSTEM DEPENDENT ROUTINE TO ALLOCATE FILES ! 701: C LUNIT = LOGICAL UNIT NUMBER ! 702: C NAME = FILE NAME, 1 CHARACTER PER WORD ! 703: C ! 704: character*32 nam ! 705: c ! 706: c close exec, save, load and print files ! 707: if (lunit .lt. 0) then ! 708: close(unit=-lunit) ! 709: return ! 710: end if ! 711: c ! 712: c Fortran 77 internal file conversion from 32a1 to character*32 ! 713: write(nam,'(32a1)') name ! 714: c ! 715: c formatted i/o for exec and print ! 716: if (lunit .gt. 2) open(unit=lunit,file=nam) ! 717: c ! 718: c unformatted i/o for save and load ! 719: if (lunit .le. 2) open(unit=lunit,file=nam,form='unformatted') ! 720: c ! 721: c rewind all except diary ! 722: if (lunit .ne. 8) rewind lunit ! 723: c ! 724: RETURN ! 725: END ! 726: ! 727: ! 728: SUBROUTINE SAVLOD(LUNIT,ID,M,N,IMG,JOB,XREAL,XIMAG) ! 729: INTEGER LUNIT,ID(4),M,N,IMG,JOB ! 730: DOUBLE PRECISION XREAL(1),XIMAG(1) ! 731: C ! 732: C IMPLEMENT SAVE AND LOAD ! 733: C LUNIT = LOGICAL UNIT NUMBER ! 734: C ID = NAME, FORMAT 4A1 ! 735: C M, N = DIMENSIONS ! 736: C IMG = NONZERO IF XIMAG IS NONZERO ! 737: C JOB = 0 FOR SAVE ! 738: C = SPACE AVAILABLE FOR LOAD ! 739: C XREAL, XIMAG = REAL AND OPTIONAL IMAGINARY PARTS ! 740: C ! 741: C THIS VERSION USES UNFORMATTED READ AND WRITE ! 742: C ! 743: IF (JOB .GT. 0) GO TO 20 ! 744: C ! 745: C SAVE ! 746: 10 WRITE(LUNIT) ID,M,N,IMG ! 747: DO 15 J = 1, N ! 748: K = (J-1)*M+1 ! 749: L = J*M ! 750: WRITE(LUNIT) (XREAL(I),I=K,L) ! 751: IF (IMG .NE. 0) WRITE(LUNIT) (XIMAG(I),I=K,L) ! 752: 15 CONTINUE ! 753: RETURN ! 754: C ! 755: C LOAD ! 756: 20 READ(LUNIT,END=30) ID,M,N,IMG ! 757: IF (M*N .GT. JOB) GO TO 30 ! 758: DO 25 J = 1, N ! 759: K = (J-1)*M+1 ! 760: L = J*M ! 761: READ(LUNIT,END=30) (XREAL(I),I=K,L) ! 762: IF (IMG .NE. 0) READ(LUNIT,END=30) (XIMAG(I),I=K,L) ! 763: 25 CONTINUE ! 764: RETURN ! 765: C ! 766: C END OF FILE ! 767: 30 M = 0 ! 768: N = 0 ! 769: RETURN ! 770: END ! 771: ! 772: ! 773: SUBROUTINE FORMZ(LUNIT,X,Y) ! 774: DOUBLE PRECISION X,Y ! 775: C ! 776: C SYSTEM DEPENDENT ROUTINE TO PRINT WITH Z FORMAT ! 777: C ! 778: IF (Y .NE. 0.0D0) WRITE(LUNIT,10) X,Y ! 779: IF (Y .EQ. 0.0D0) WRITE(LUNIT,10) X ! 780: 10 format(2z18) ! 781: RETURN ! 782: END ! 783: ! 784: ! 785: DOUBLE PRECISION FUNCTION FLOP(X) ! 786: DOUBLE PRECISION X ! 787: C SYSTEM DEPENDENT FUNCTION ! 788: C COUNT AND POSSIBLY CHOP EACH FLOATING POINT OPERATION ! 789: C FLP(1) IS FLOP COUNTER ! 790: C FLP(2) IS NUMBER OF PLACES TO BE CHOPPED ! 791: C ! 792: INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2) ! 793: COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN ! 794: C ! 795: double precision mask(14),xx,mm ! 796: real mas(2,14) ! 797: logical lx(2),lm(2) ! 798: equivalence (lx(1),xx),(lm(1),mm) ! 799: equivalence (mask(1),mas(1)) ! 800: data mas/ ! 801: $ z'ffffffff',z'fff0ffff', ! 802: $ z'ffffffff',z'ff00ffff', ! 803: $ z'ffffffff',z'f000ffff', ! 804: $ z'ffffffff',z'0000ffff', ! 805: $ z'ffffffff',z'0000fff0', ! 806: $ z'ffffffff',z'0000ff00', ! 807: $ z'ffffffff',z'0000f000', ! 808: $ z'ffffffff',z'00000000', ! 809: $ z'fff0ffff',z'00000000', ! 810: $ z'ff00ffff',z'00000000', ! 811: $ z'f000ffff',z'00000000', ! 812: $ z'0000ffff',z'00000000', ! 813: $ z'0000fff0',z'00000000', ! 814: $ z'0000ff80',z'00000000'/ ! 815: C ! 816: FLP(1) = FLP(1) + 1 ! 817: K = FLP(2) ! 818: FLOP = X ! 819: IF (K .LE. 0) RETURN ! 820: FLOP = 0.0D0 ! 821: IF (K .GE. 15) RETURN ! 822: XX = X ! 823: MM = MASK(K) ! 824: LX(1) = and(LX(1),LM(1)) ! 825: LX(2) = and(LX(2),LM(2)) ! 826: FLOP = XX ! 827: RETURN ! 828: END ! 829: ! 830: ! 831: SUBROUTINE XCHAR(BUF,K) ! 832: INTEGER BUF(1),K ! 833: C ! 834: C SYSTEM DEPENDENT ROUTINE TO HANDLE SPECIAL CHARACTERS ! 835: C ! 836: INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),RIO,WIO,RTE,WTE ! 837: COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,RIO,WIO,RTE,WTE ! 838: write(WTE,10) buf(1) ! 839: 10 format(A1,' is not a MATLAB character.') ! 840: RETURN ! 841: END ! 842: ! 843: ! 844: SUBROUTINE USER(A,M,N,S,T) ! 845: DOUBLE PRECISION A(M,N),S,T ! 846: C ! 847: INTEGER A3(9) ! 848: DATA A3 /-149,537,-27,-50,180,-9,-154,546,-25/ ! 849: IF (A(1,1) .NE. 3.0D0) RETURN ! 850: DO 10 I = 1, 9 ! 851: A(I,1) = A3(I) ! 852: 10 CONTINUE ! 853: M = 3 ! 854: N = 3 ! 855: RETURN ! 856: END ! 857: ! 858: ! 859: SUBROUTINE PROMPT(PAUSE) ! 860: INTEGER PAUSE ! 861: C ! 862: C ISSUE MATLAB PROMPT WITH OPTIONAL PAUSE ! 863: C ! 864: INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),RIO,WIO,RTE,WTE ! 865: COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,RIO,WIO,RTE,WTE ! 866: WRITE(WTE,10) ! 867: IF (WIO .NE. 0) WRITE(WIO,10) ! 868: 10 FORMAT(1X,/'<>') ! 869: IF (PAUSE .EQ. 1) READ(RTE,20) DUMMY ! 870: 20 FORMAT(A1) ! 871: RETURN ! 872: END ! 873: ! 874: ! 875: SUBROUTINE PLOT(LUNIT,X,Y,N,P,K,BUF) ! 876: DOUBLE PRECISION X(N),Y(N),P(1) ! 877: INTEGER BUF(79) ! 878: C ! 879: C PLOT X VS. Y ON LUNIT ! 880: C IF K IS NONZERO, THEN P(1),...,P(K) ARE EXTRA PARAMETERS ! 881: C BUF IS WORK SPACE ! 882: C ! 883: DOUBLE PRECISION XMIN,YMIN,XMAX,YMAX,DY,DX,Y1,Y0 ! 884: INTEGER AST,BLANK,H,W ! 885: DATA AST/1H*/,BLANK/1H /,H/20/,W/79/ ! 886: C ! 887: C H = HEIGHT, W = WIDTH ! 888: C ! 889: XMIN = X(1) ! 890: XMAX = X(1) ! 891: YMIN = Y(1) ! 892: YMAX = Y(1) ! 893: DO 10 I = 1, N ! 894: XMIN = DMIN1(XMIN,X(I)) ! 895: XMAX = DMAX1(XMAX,X(I)) ! 896: YMIN = DMIN1(YMIN,Y(I)) ! 897: YMAX = DMAX1(YMAX,Y(I)) ! 898: 10 CONTINUE ! 899: DX = XMAX - XMIN ! 900: IF (DX .EQ. 0.0D0) DX = 1.0D0 ! 901: DY = YMAX - YMIN ! 902: WRITE(LUNIT,35) ! 903: DO 40 L = 1, H ! 904: DO 20 J = 1, W ! 905: BUF(J) = BLANK ! 906: 20 CONTINUE ! 907: Y1 = YMIN + (H-L+1)*DY/H ! 908: Y0 = YMIN + (H-L)*DY/H ! 909: JMAX = 1 ! 910: DO 30 I = 1, N ! 911: IF (Y(I) .GT. Y1) GO TO 30 ! 912: IF (L.NE.H .AND. Y(I).LE.Y0) GO TO 30 ! 913: J = 1 + (W-1)*(X(I) - XMIN)/DX ! 914: BUF(J) = AST ! 915: JMAX = MAX0(JMAX,J) ! 916: 30 CONTINUE ! 917: WRITE(LUNIT,35) (BUF(J),J=1,JMAX) ! 918: 35 FORMAT(1X,79A1) ! 919: 40 CONTINUE ! 920: RETURN ! 921: END ! 922: ! 923: ! 924: SUBROUTINE EDIT(BUF,N) ! 925: INTEGER BUF(N) ! 926: C ! 927: C CALLED AFTER INPUT OF A SINGLE BACKSLASH ! 928: C BUF CONTAINS PREVIOUS INPUT LINE, ONE CHAR PER WORD ! 929: C ENTER LOCAL EDITOR IF POSSIBLE ! 930: C ! 931: character*256 s ! 932: open(7,file='----') ! 933: write(7,10) (buf(i),i=1,n) ! 934: 10 format(256a1) ! 935: close(7) ! 936: call system('edit ----') ! 937: open(7,file='----') ! 938: rewind 7 ! 939: read(7,'(a)') s ! 940: close(7) ! 941: call system('remove ----') ! 942: n = 0 ! 943: do 20 i = 1, 256 ! 944: if (s(i:i) .ne. ' ') n = i ! 945: 20 continue ! 946: read(s,10) (buf(i),i=1,n) ! 947: RETURN ! 948: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.