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