Annotation of researchv10dc/cmd/matlab/install.n, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.