home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 172.lha / Matlab.for < prev    next >
Text File  |  1988-04-28  |  312KB  |  7,569 lines

  1. C     PROGRAM MAIN FOR Amiga            
  2.       PROGRAM BIGMAT
  3.       CALL MATLAB(0)   
  4.       STOP             
  5.       END              
  6.               
  7.       SUBROUTINE CLAUSE                   
  8.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  9.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  10.       INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ       
  11.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE    
  12.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  13.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  14.       COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ               
  15.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE          
  16.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  17.       INTEGER FOR(4),WHILE(4),IFF(4),ELSE(4),ENND(4),DO(4),THENN(4)             
  18.       INTEGER SEMI,EQUAL,EOL,BLANK,R      
  19.       INTEGER OP,COMMA,LESS,GREAT,NAME    
  20.       LOGICAL EQID     
  21.       DOUBLE PRECISION E1,E2              
  22.       DATA SEMI/39/,EQUAL/46/,EOL/99/,BLANK/36/              
  23.       DATA COMMA/48/,LESS/50/,GREAT/51/,NAME/1/              
  24.       DATA FOR/15,24,27,36/,WHILE/32,17,18,21/,IFF/18,15,36,36/                 
  25.       DATA ELSE/14,21,28,14/,ENND/14,23,13,36/               
  26.       DATA DO/13,24,36,36/,THENN/29,17,14,23/                
  27.       R = -FIN-10      
  28.       FIN = 0          
  29.       IF (DDT .EQ. 1) WRITE(WTE,100) PT,RSTK(PT),R           
  30.   100 FORMAT(1X,'CLAUSE',3I4)             
  31.       IF (R.LT.1 .OR. R.GT.6) GO TO 01    
  32.       GO TO (02,30,30,80,99,90),R         
  33.    01 R = RSTK(PT)     
  34.       GO TO (99,99,05,40,45,99,99,99,99,99,99,99,15,55,99,99,99),R              
  35. C                      
  36. C     FOR              
  37. C                      
  38.    02 CALL GETSYM      
  39.       IF (SYM .NE. NAME) CALL ERROR(34)   
  40.       IF (ERR .GT. 0) RETURN              
  41.       PT = PT+2        
  42.       CALL PUTID(IDS(1,PT),SYN)           
  43.       CALL GETSYM      
  44.       IF (SYM .NE. EQUAL) CALL ERROR(34)  
  45.       IF (ERR .GT. 0) RETURN              
  46.       CALL GETSYM      
  47.       RSTK(PT) = 3     
  48. C     *CALL* EXPR      
  49.       RETURN           
  50.    05 PSTK(PT-1) = 0   
  51.       PSTK(PT) = LPT(4) - 1               
  52.       IF (EQID(SYN,DO)) SYM = SEMI        
  53.       IF (SYM .EQ. COMMA) SYM = SEMI      
  54.       IF (SYM .NE. SEMI) CALL ERROR(34)   
  55.       IF (ERR .GT. 0) RETURN              
  56.    10 J = PSTK(PT-1)   
  57.       LPT(4) = PSTK(PT)                   
  58.       SYM = SEMI       
  59.       CHAR = BLANK     
  60.       J = J+1          
  61.       L = LSTK(TOP)    
  62.       M = MSTK(TOP)    
  63.       N = NSTK(TOP)    
  64.       LJ = L+(J-1)*M   
  65.       L2 = L + M*N     
  66.       IF (M .NE. -3) GO TO 12             
  67.       LJ = L+3         
  68.       L2 = LJ          
  69.       STKR(LJ) = STKR(L) + DFLOAT(J-1)*STKR(L+1)             
  70.       STKI(LJ) = 0.0   
  71.       IF (STKR(L+1).GT.0.0D0 .AND. STKR(LJ).GT.STKR(L+2)) GO TO 20              
  72.       IF (STKR(L+1).LT.0.0D0 .AND. STKR(LJ).LT.STKR(L+2)) GO TO 20              
  73.       M = 1            
  74.       N = J            
  75.    12 IF (J .GT. N) GO TO 20              
  76.       IF (TOP+1 .GE. BOT) CALL ERROR(18)  
  77.       IF (ERR .GT. 0) RETURN              
  78.       TOP = TOP+1      
  79.       LSTK(TOP) = L2   
  80.       MSTK(TOP) = M    
  81.       NSTK(TOP) = 1    
  82.       ERR = L2+M - LSTK(BOT)              
  83.       IF (ERR .GT. 0) CALL ERROR(17)      
  84.       IF (ERR .GT. 0) RETURN              
  85.       CALL WCOPY(M,STKR(LJ),STKI(LJ),1,STKR(L2),STKI(L2),1)  
  86.       RHS = 0          
  87.       CALL STACKP(IDS(1,PT))              
  88.       IF (ERR .GT. 0) RETURN              
  89.       PSTK(PT-1) = J   
  90.       PSTK(PT) = LPT(4)                   
  91.       RSTK(PT) = 13    
  92. C     *CALL* PARSE     
  93.       RETURN           
  94.    15 GO TO 10         
  95.    20 MSTK(TOP) = 0    
  96.       NSTK(TOP) = 0    
  97.       RHS = 0          
  98.       CALL STACKP(IDS(1,PT))              
  99.       IF (ERR .GT. 0) RETURN              
  100.       PT = PT-2        
  101.       GO TO 80         
  102. C                      
  103. C     WHILE OR IF      
  104. C                      
  105.    30 PT = PT+1        
  106.       CALL PUTID(IDS(1,PT),SYN)           
  107.       PSTK(PT) = LPT(4)-1                 
  108.    35 LPT(4) = PSTK(PT)                   
  109.       CHAR = BLANK     
  110.       CALL GETSYM      
  111.       RSTK(PT) = 4     
  112. C     *CALL* EXPR      
  113.       RETURN           
  114.    40 IF (SYM.NE.EQUAL .AND. SYM.NE.LESS .AND. SYM.NE.GREAT) 
  115.      $    CALL ERROR(35)                  
  116.       IF (ERR .GT. 0) RETURN              
  117.       OP = SYM         
  118.       CALL GETSYM      
  119.       IF (SYM.EQ.EQUAL .OR. SYM.EQ.GREAT) OP = OP + SYM      
  120.       IF (OP .GT. GREAT) CALL GETSYM      
  121.       PSTK(PT) = 256*PSTK(PT) + OP        
  122.       RSTK(PT) = 5     
  123. C     *CALL* EXPR      
  124.       RETURN           
  125.    45 OP = MOD(PSTK(PT),256)              
  126.       PSTK(PT) = PSTK(PT)/256             
  127.       L = LSTK(TOP-1)                     
  128.       E1 = STKR(L)     
  129.       L = LSTK(TOP)    
  130.       E2 = STKR(L)     
  131.       TOP = TOP - 2    
  132.       IF (EQID(SYN,DO) .OR. EQID(SYN,THENN)) SYM = SEMI      
  133.       IF (SYM .EQ. COMMA) SYM = SEMI      
  134.       IF (SYM .NE. SEMI) CALL ERROR(35)   
  135.       IF (ERR .GT. 0) RETURN              
  136.       IF (OP.EQ.EQUAL         .AND. E1.EQ.E2) GO TO 50       
  137.       IF (OP.EQ.LESS          .AND. E1.LT.E2) GO TO 50       
  138.       IF (OP.EQ.GREAT         .AND. E1.GT.E2) GO TO 50       
  139.       IF (OP.EQ.(LESS+EQUAL)  .AND. E1.LE.E2) GO TO 50       
  140.       IF (OP.EQ.(GREAT+EQUAL) .AND. E1.GE.E2) GO TO 50       
  141.       IF (OP.EQ.(LESS+GREAT)  .AND. E1.NE.E2) GO TO 50       
  142.       PT = PT-1        
  143.       GO TO 80         
  144.    50 RSTK(PT) = 14    
  145. C     *CALL* PARSE     
  146.       RETURN           
  147.    55 IF (EQID(IDS(1,PT),WHILE)) GO TO 35                    
  148.       PT = PT-1        
  149.       IF (EQID(SYN,ELSE)) GO TO 80        
  150.       RETURN           
  151. C                      
  152. C     SEARCH FOR MATCHING END OR ELSE     
  153.    80 KOUNT = 0        
  154.       CALL GETSYM      
  155.    82 IF (SYM .EQ. EOL) RETURN            
  156.       IF (SYM .NE. NAME) GO TO 83         
  157.       IF (EQID(SYN,ENND) .AND. KOUNT.EQ.0) RETURN            
  158.       IF (EQID(SYN,ELSE) .AND. KOUNT.EQ.0) RETURN            
  159.       IF (EQID(SYN,ENND) .OR. EQID(SYN,ELSE))                
  160.      $       KOUNT = KOUNT-1              
  161.       IF (EQID(SYN,FOR) .OR. EQID(SYN,WHILE)                 
  162.      $       .OR. EQID(SYN,IFF)) KOUNT = KOUNT+1             
  163.    83 CALL GETSYM      
  164.       GO TO 82         
  165. C                      
  166. C     EXIT FROM LOOP   
  167.    90 IF (DDT .EQ. 1) WRITE(WTE,190) (RSTK(I),I=1,PT)        
  168.   190 FORMAT(1X,'EXIT  ',10I4)            
  169.       IF (RSTK(PT) .EQ. 14) PT = PT-1     
  170.       IF (PT .LE. PTZ) RETURN             
  171.       IF (RSTK(PT) .EQ. 14) PT = PT-1     
  172.       IF (PT-1 .LE. PTZ) RETURN           
  173.       IF (RSTK(PT) .EQ. 13) TOP = TOP-1   
  174.       IF (RSTK(PT) .EQ. 13) PT = PT-2     
  175.       GO TO 80         
  176. C                      
  177.    99 CALL ERROR(22)   
  178.       IF (ERR .GT. 0) RETURN              
  179.       RETURN           
  180.       END
  181.               
  182.       SUBROUTINE COMAND(ID)               
  183.       INTEGER ID(4)    
  184.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  185.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  186.       INTEGER ALFA(52),ALFB(52),ALFL,CASE                    
  187.       INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ       
  188.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  189.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  190.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  191.       COMMON /ALFS/ ALFA,ALFB,ALFL,CASE   
  192.       COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ               
  193.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  194.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  195.       INTEGER CMD(4,17),CMDL,A,D,E,Z,LRECL,CH,BLANK,NAME,DOT,H(4)               
  196.       INTEGER SEMI,COMMA,EOL              
  197.       DOUBLE PRECISION URAND              
  198.       LOGICAL EQID     
  199.       DATA CMDL/17/,A/10/,D/13/,E/14/,Z/35/,EOL/99/,SEMI/39/,COMMA/48/          
  200.       DATA BLANK/36/,NAME/1/,DOT/47/      
  201. C                      
  202. C       CLEAR ELSE  END   EXIT            
  203. C       FOR   HELP  IF    LONG            
  204. C       RETUR SEMI     
  205. C       SHORT WHAT  WHILE                 
  206. C       WHO   WHY   LALA  FOO             
  207.       DATA CMD/        
  208.      $  12,21,14,10, 14,21,28,14, 14,23,13,36, 14,33,18,29,  
  209.      $  15,24,27,36, 17,14,21,25, 18,15,36,36, 21,24,23,16,  
  210.      $  27,14,29,30, 28,14,22,18,         
  211.      $  28,17,24,27, 32,17,10,29, 32,17,18,21,               
  212.      $  32,17,24,36, 32,17,34,36, 21,10,21,10, 15,30,12,20/  
  213. C                      
  214.       DATA LRECL/80/   
  215.   101 FORMAT(80A1)     
  216.   102 FORMAT(1X,80A1)                     
  217. C                      
  218.       IF (DDT .EQ. 1) WRITE(WTE,100)      
  219.   100 FORMAT(1X,'COMAND')                 
  220.       FUN = 0          
  221.       DO 10 K = 1, CMDL                   
  222.         IF (EQID(ID,CMD(1,K))) GO TO 20   
  223.    10 CONTINUE         
  224.       FIN = 0          
  225.       RETURN           
  226. C                      
  227.    20 IF (CHAR.EQ.COMMA .OR. CHAR.EQ.SEMI .OR. CHAR.EQ.EOL) GO TO 22            
  228.       IF (CHAR.LE.Z .OR. K.EQ.6) GO TO 22                    
  229.       CALL ERROR(16)   
  230.       RETURN           
  231. C                      
  232.    22 FIN = 1          
  233.       GO TO (25,36,38,40,30,80,34,52,44,55,50,65,32,60,70,46,48),K              
  234. C                      
  235. C     CLEAR            
  236.    25 IF (CHAR.GE.A .AND. CHAR.LE.Z) GO TO 26                
  237.       BOT = LSIZE-3    
  238.       GO TO 98         
  239.    26 CALL GETSYM      
  240.       TOP = TOP+1      
  241.       MSTK(TOP) = 0    
  242.       NSTK(TOP) = 0    
  243.       RHS = 0          
  244.       CALL STACKP(SYN)                    
  245.       IF (ERR .GT. 0) RETURN              
  246.       FIN = 1          
  247.       GO TO 98         
  248. C                      
  249. C     FOR, WHILE, IF, ELSE, END           
  250.    30 FIN = -11        
  251.       GO TO 99         
  252.    32 FIN = -12        
  253.       GO TO 99         
  254.    34 FIN = -13        
  255.       GO TO 99         
  256.    36 FIN = -14        
  257.       GO TO 99         
  258.    38 FIN = -15        
  259.       GO TO 99         
  260. C                      
  261. C     EXIT             
  262.    40 IF (PT .GT. PTZ) FIN = -16          
  263.       IF (PT .GT. PTZ) GO TO 98           
  264.       K = IDINT(STKR(VSIZE-2))            
  265.       WRITE(WTE,140) K                    
  266.       IF (WIO .NE. 0) WRITE(WIO,140) K    
  267.   140 FORMAT(/1X,'total flops ',I9//1X,'ADIOS'/)             
  268.       FUN = 99         
  269.       GO TO 98         
  270. C                      
  271. C     RETURN           
  272.    44 K = LPT(1) - 7   
  273.       IF (K .LE. 0) FUN = 99              
  274.       IF (K .LE. 0) GO TO 98              
  275.       CALL FILES(-1*RIO,BUF)                
  276.       LPT(1) = LIN(K+1)                   
  277.       LPT(4) = LIN(K+2)                   
  278.       LPT(6) = LIN(K+3)                   
  279.       PTZ = LIN(K+4)   
  280.       RIO = LIN(K+5)   
  281.       LCT(4) = LIN(K+6)                   
  282.       CHAR = BLANK     
  283.       SYM = COMMA      
  284.       GO TO 99         
  285. C                      
  286. C     LALA             
  287.    46 WRITE(WTE,146)   
  288.   146 FORMAT(1X,'QUIT SINGING AND GET BACK TO WORK.')        
  289.       GO TO 98         
  290. C                      
  291. C     FOO              
  292.    48 WRITE(WTE,148)   
  293.   148 FORMAT(1X,'YOUR PLACE OR MINE')     
  294.       GO TO 98         
  295. C                      
  296. C     SHORT, LONG      
  297.    50 FMT = 1          
  298.       GO TO 54         
  299.    52 FMT = 2          
  300.    54 IF (CHAR.EQ.E .OR. CHAR.EQ.D) FMT = FMT+2              
  301.       IF (CHAR .EQ. Z) FMT = 5            
  302.       IF (CHAR.EQ.E .OR. CHAR.EQ.D .OR. CHAR.EQ.Z) CALL GETSYM                  
  303.       GO TO 98         
  304. C                      
  305. C     SEMI             
  306.    55 LCT(3) = 1 - LCT(3)                 
  307.       GO TO 98         
  308. C                      
  309. C     WHO              
  310.    60 WRITE(WTE,160)   
  311.       IF (WIO .NE. 0) WRITE(WIO,160)      
  312.   160 FORMAT(1X,'Your current variables are...')             
  313.       CALL PRNTID(IDSTK(1,BOT),LSIZE-BOT+1)                  
  314.       L = VSIZE-LSTK(BOT)+1               
  315.       WRITE(WTE,161) L,VSIZE              
  316.       IF (WIO .NE. 0) WRITE(WIO,161) L,VSIZE                 
  317.   161 FORMAT(1X,'using ',I7,' out of ',I7,' elements.')      
  318.       GO TO 98         
  319. C                      
  320. C     WHAT             
  321.    65 WRITE(WTE,165)   
  322.   165 FORMAT(1X,'The functions and commands are...')         
  323.       H(1) = 0         
  324.       CALL FUNS(H)     
  325.       CALL PRNTID(CMD,CMDL-2)             
  326.       GO TO 98         
  327. C                      
  328. C     WHY              
  329.    70 K = IDINT(9.0D0*URAND(RAN(1))+1.0D0)                   
  330.       GO TO (71,72,73,74,75,76,77,78,79),K                   
  331.    71 WRITE(WTE,171)   
  332.   171 FORMAT(1X,'WHAT?')                  
  333.       GO TO 98         
  334.    72 WRITE(WTE,172)   
  335.   172 FORMAT(1X,'R.T.F.M.')               
  336.       GO TO 98         
  337.    73 WRITE(WTE,173)   
  338.   173 FORMAT(1X,'HOW THE HELL SHOULD I KNOW?')               
  339.       GO TO 98         
  340.    74 WRITE(WTE,174)   
  341.   174 FORMAT(1X,'PETE MADE ME DO IT.')    
  342.       GO TO 98         
  343.    75 WRITE(WTE,175)   
  344.   175 FORMAT(1X,'INSUFFICIENT DATA TO ANSWER.')              
  345.       GO TO 98         
  346.    76 WRITE(WTE,176)   
  347.   176 FORMAT(1X,'IT FEELS GOOD.')         
  348.       GO TO 98         
  349.    77 WRITE(WTE,177)   
  350.   177 FORMAT(1X,'WHY NOT?')               
  351.       GO TO 98         
  352.    78 WRITE(WTE,178)   
  353.   178 FORMAT(1X,'/--ERROR'/1X,'STUPID QUESTION.')            
  354.       GO TO 98         
  355.    79 WRITE(WTE,179)   
  356.   179 FORMAT(1X,'SYSTEM ERROR, RETRY')    
  357.       GO TO 98         
  358. C                      
  359. C     HELP             
  360.    80 IF (CHAR .NE. EOL) GO TO 81         
  361.       WRITE(WTE,180)   
  362.       IF (WIO .NE. 0) WRITE(WIO,180)      
  363.   180 FORMAT(1X,'Type HELP followed by ...'                  
  364.      $  /1X,'INTRO   (To get started)'    
  365.      $  /1X,'NEWS    (recent revisions)')                    
  366.       H(1) = 0         
  367.       CALL FUNS(H)     
  368.       CALL PRNTID(CMD,CMDL-2)             
  369.       J = BLANK+2      
  370.       WRITE(WTE,181)   
  371.       IF (WIO .NE. 0) WRITE(WIO,181)      
  372.   181 FORMAT(1X,'ANS   EDIT  FILE  FUN   MACRO')             
  373.       WRITE(WTE,182) (ALFA(I),I=J,ALFL)   
  374.       IF (WIO .NE. 0) WRITE(WIO,182) (ALFA(I),I=J,ALFL)      
  375.   182 FORMAT(1X,17(A1,1X)/)               
  376.       GO TO 98         
  377. C                      
  378.    81 CALL GETSYM      
  379.       IF (SYM .EQ. NAME) GO TO 82         
  380.       IF (SYM .EQ. 0) SYM = DOT           
  381.       H(1) = ALFA(SYM+1)                  
  382.       H(2) = ALFA(BLANK+1)                
  383.       H(3) = ALFA(BLANK+1)                
  384.       H(4) = ALFA(BLANK+1)                
  385.       GO TO 84         
  386.    82 DO 83 I = 1, 4   
  387.         CH = SYN(I)    
  388.         H(I) = ALFA(CH+1)                 
  389.    83 CONTINUE         
  390.    
  391.    84 IF(HIO .NE. 0) THEN
  392.       READ(HIO,101,END=89) (BUF(I),I=1,LRECL)                
  393. CDC.. IF (EOF(HIO).NE.0) GO TO 89         
  394.       DO 85 I = 1, 4   
  395.         IF (H(I) .NE. BUF(I)) GO TO 84    
  396.    85 CONTINUE         
  397.       WRITE(WTE,102)   
  398.       IF (WIO .NE. 0) WRITE(WIO,102)      
  399.    86 K = LRECL + 1    
  400.    87 K = K - 1        
  401.       IF (BUF(K) .EQ. ALFA(BLANK+1)) GO TO 87                
  402.       WRITE(WTE,102) (BUF(I),I=1,K)       
  403.       IF (WIO .NE. 0) WRITE(WIO,102) (BUF(I),I=1,K)          
  404.       READ(HIO,101) (BUF(I),I=1,LRECL)    
  405.       IF (BUF(1) .EQ. ALFA(BLANK+1)) GO TO 86                
  406.       CALL FILES(-HIO,BUF)                
  407.       GO TO 98 
  408.       ENDIF        
  409. C                      
  410.    89 WRITE(WTE,189) (H(I),I=1,4)         
  411.   189 FORMAT(1X,'SORRY, NO HELP ON ',4A1)                    
  412.       CALL FILES(-HIO,BUF)                
  413.       GO TO 98         
  414. C                      
  415.    98 CALL GETSYM      
  416.    99 RETURN           
  417.       END
  418.              
  419.       SUBROUTINE EDIT(BUF,N)              
  420.       INTEGER BUF(N)   
  421. C                      
  422. C     CALLED AFTER INPUT OF A SINGLE BACKSLASH               
  423. C     BUF CONTAINS PREVIOUS INPUT LINE, ONE CHAR PER WORD    
  424. C     ENTER LOCAL EDITOR IF AVAILABLE     
  425. C     OTHERWISE JUST   
  426.       RETURN           
  427.       END              
  428.               
  429.       SUBROUTINE ERROR(N)                 
  430.       INTEGER N        
  431.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  432.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  433.       INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ       
  434.       INTEGER ALFA(52),ALFB(52),ALFL,CASE                    
  435.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  436.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  437.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  438.       COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ               
  439.       COMMON /ALFS/ ALFA,ALFB,ALFL,CASE   
  440.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  441.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  442.       INTEGER ERRMSG(8),BLH,BEL           
  443.       DATA ERRMSG /1H/,1H-,1H-,1HE,1HR,1HR,1HO,1HR/,BLH/1H /,BEL/1H /           
  444. C     SET BEL TO CTRL-G IF POSSIBLE       
  445. C                      
  446.       K = LPT(2) - LPT(1)                 
  447.       IF (K .LT. 1) K = 1                 
  448.       LUNIT = WTE      
  449.    98 WRITE(LUNIT,100) (BLH,I=1,K),(ERRMSG(I),I=1,8),BEL     
  450.   100 FORMAT(1X,80A1)                     
  451.       GO TO (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,          
  452.      $      23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40),N            
  453. C                      
  454.     1 WRITE(LUNIT,101)                    
  455.   101 FORMAT(1X,'IMPROPER MULTIPLE ASSIGNMENT')              
  456.       GO TO 99         
  457.     2 WRITE(LUNIT,102)                    
  458.   102 FORMAT(1X,'IMPROPER FACTOR')        
  459.       GO TO 99         
  460.     3 WRITE(LUNIT,103)                    
  461.   103 FORMAT(1X,'EXPECT RIGHT PARENTHESIS')                  
  462.       GO TO 99         
  463.     4 DO 94 I = 1, 4   
  464.          K = IDS(I,PT+1)                  
  465.          BUF(I) = ALFA(K+1)               
  466.    94 CONTINUE         
  467.       WRITE(LUNIT,104) (BUF(I),I=1,4)     
  468.   104 FORMAT(1X,'UNDEFINED VARIABLE: ',4A1)                  
  469.       GO TO 99         
  470.     5 WRITE(LUNIT,105)                    
  471.   105 FORMAT(1X,'COLUMN LENGTHS DO NOT MATCH')               
  472.       GO TO 99         
  473.     6 WRITE(LUNIT,106)                    
  474.   106 FORMAT(1X,'ROW LENGTHS DO NOT MATCH')                  
  475.       GO TO 99         
  476.     7 WRITE(LUNIT,107)                    
  477.   107 FORMAT(1X,'TEXT TOO LONG')          
  478.       GO TO 99         
  479.     8 WRITE(LUNIT,108)                    
  480.   108 FORMAT(1X,'INCOMPATIBLE FOR ADDITION')                 
  481.       GO TO 99         
  482.     9 WRITE(LUNIT,109)                    
  483.   109 FORMAT(1X,'INCOMPATIBLE FOR SUBTRACTION')              
  484.       GO TO 99         
  485.    10 WRITE(LUNIT,110)                    
  486.   110 FORMAT(1X,'INCOMPATIBLE FOR MULTIPLICATION')           
  487.        GO TO 99        
  488.    11 WRITE(LUNIT,111)                    
  489.   111 FORMAT(1X,'INCOMPATIBLE FOR RIGHT DIVISION')           
  490.       GO TO 99         
  491.    12 WRITE(LUNIT,112)                    
  492.   112 FORMAT(1X,'INCOMPATIBLE FOR LEFT DIVISION')            
  493.       GO TO 99         
  494.    13 WRITE(LUNIT,113)                    
  495.   113 FORMAT(1X,'IMPROPER ASSIGNMENT TO PERMANENT VARIABLE') 
  496.       GO TO 99         
  497.    14 WRITE(LUNIT,114)                    
  498.   114 FORMAT(1X,'EYE-DENTITY UNDEFINED BY CONTEXT')          
  499.       GO TO 99         
  500.    15 WRITE(LUNIT,115)                    
  501.   115 FORMAT(1X,'IMPROPER ASSIGNMENT TO SUBMATRIX')          
  502.       GO TO 99         
  503.    16 WRITE(LUNIT,116)                    
  504.   116 FORMAT(1X,'IMPROPER COMMAND')       
  505.       GO TO 99         
  506.    17 LB = VSIZE - LSTK(BOT) + 1          
  507.       LT = ERR + LSTK(BOT)                
  508.       WRITE(LUNIT,117) LB,LT,VSIZE        
  509.   117 FORMAT(1X,'TOO MUCH MEMORY REQUIRED'                   
  510.      $  /1X,' ',I7,' VARIABLES,',I7,' TEMPORARIES,',I7,' AVAILABLE.')           
  511.       GO TO 99         
  512.    18 WRITE(LUNIT,118)                    
  513.   118 FORMAT(1X,'TOO MANY NAMES')         
  514.       GO TO 99         
  515.    19 WRITE(LUNIT,119)                    
  516.   119 FORMAT(1X,'MATRIX IS SINGULAR TO WORKING PRECISION')   
  517.       GO TO 99         
  518.    20 WRITE(LUNIT,120)                    
  519.   120 FORMAT(1X,'MATRIX MUST BE SQUARE')  
  520.       GO TO 99         
  521.    21 WRITE(LUNIT,121)                    
  522.   121 FORMAT(1X,'SUBSCRIPT OUT OF RANGE')                    
  523.       GO TO 99         
  524.    22 WRITE(LUNIT,122) (RSTK(I),I=1,PT)   
  525.   122 FORMAT(1X,'RECURSION DIFFICULTIES',10I4)               
  526.       GO TO 99         
  527.    23 WRITE(LUNIT,123)                    
  528.   123 FORMAT(1X,'ONLY 1, 2 OR INF NORM OF MATRIX')           
  529.       GO TO 99         
  530.    24 WRITE(LUNIT,124)                    
  531.   124 FORMAT(1X,'NO CONVERGENCE')         
  532.       GO TO 99         
  533.    25 WRITE(LUNIT,125)                    
  534.   125 FORMAT(1X,'CAN NOT USE FUNCTION NAME AS VARIABLE')     
  535.       GO TO 99         
  536.    26 WRITE(LUNIT,126)                    
  537.   126 FORMAT(1X,'TOO COMPLICATED (STACK OVERFLOW)')          
  538.       GO TO 99         
  539.    27 WRITE(LUNIT,127)                    
  540.   127 FORMAT(1X,'DIVISION BY ZERO IS A NO-NO')               
  541.       GO TO 99         
  542.    28 WRITE(LUNIT,128)                    
  543.   128 FORMAT(1X,'EMPTY MACRO')            
  544.       GO TO 99         
  545.    29 WRITE(LUNIT,129)                    
  546.   129 FORMAT(1X,'NOT POSITIVE DEFINITE')  
  547.       GO TO 99         
  548.    30 WRITE(LUNIT,130)                    
  549.   130 FORMAT(1X,'IMPROPER EXPONENT')      
  550.       GO TO 99         
  551.    31 WRITE(LUNIT,131)                    
  552.   131 FORMAT(1X,'IMPROPER STRING')        
  553.       GO TO 99         
  554.    32 WRITE(LUNIT,132)                    
  555.   132 FORMAT(1X,'SINGULARITY OF LOG OR ATAN')                
  556.       GO TO 99         
  557.    33 WRITE(LUNIT,133)                    
  558.   133 FORMAT(1X,'TOO MANY COLONS')        
  559.       GO TO 99         
  560.    34 WRITE(LUNIT,134)                    
  561.   134 FORMAT(1X,'IMPROPER FOR CLAUSE')    
  562.       GO TO 99         
  563.    35 WRITE(LUNIT,135)                    
  564.   135 FORMAT(1X,'IMPROPER WHILE OR IF CLAUSE')               
  565.       GO TO 99         
  566.    36 WRITE(LUNIT,136)                    
  567.   136 FORMAT(1X,'ARGUMENT OUT OF RANGE')  
  568.       GO TO 99         
  569.    37 WRITE(LUNIT,137)                    
  570.   137 FORMAT(1X,'IMPROPER MACRO')         
  571.       GO TO 99         
  572.    38 WRITE(LUNIT,138)                    
  573.   138 FORMAT(1X,'IMPROPER FILE NAME')     
  574.       GO TO 99         
  575.    39 WRITE(LUNIT,139)                    
  576.   139 FORMAT(1X,'INCORRECT NUMBER OF ARGUMENTS')             
  577.       GO TO 99         
  578.    40 WRITE(LUNIT,140)                    
  579.   140 FORMAT(1X,'EXPECT STATEMENT TERMINATOR')               
  580.       GO TO 99         
  581. C                      
  582.    99 ERR = N          
  583.       IF (LUNIT.EQ.WIO .OR. WIO.EQ.0) RETURN                 
  584.       LUNIT = WIO      
  585.       GO TO 98         
  586.       END
  587.       SUBROUTINE EXPR                     
  588.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  589.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  590.       INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ       
  591.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  592.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  593.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  594.       COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ               
  595.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  596.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  597.       INTEGER OP,R,BLANK,SIGN,PLUS,MINUS,NAME,COLON,EYE(4)   
  598.       DATA COLON/40/,BLANK/36/,PLUS/41/,MINUS/42/,NAME/1/    
  599.       DATA EYE/14,34,14,36/               
  600.       IF (DDT .EQ. 1) WRITE(WTE,100) PT,RSTK(PT)             
  601.   100 FORMAT(1X,'EXPR  ',2I4)             
  602.       R = RSTK(PT)     
  603.       GO TO (01,01,01,01,01,05,25,99,99,01,01,99,99,99,99,99,99,01,01,          
  604.      $       01),R     
  605.    01 IF (SYM .EQ. COLON) CALL PUTID(SYN,EYE)                
  606.       IF (SYM .EQ. COLON) SYM = NAME      
  607.       KOUNT = 1        
  608.    02 SIGN = PLUS      
  609.       IF (SYM .EQ. MINUS) SIGN = MINUS    
  610.       IF (SYM.EQ.PLUS .OR. SYM.EQ.MINUS) CALL GETSYM         
  611.       PT = PT+1        
  612.       IF (PT .GT. PSIZE-1) CALL ERROR(26)                    
  613.       IF (ERR .GT. 0) RETURN              
  614.       PSTK(PT) = SIGN + 256*KOUNT         
  615.       RSTK(PT) = 6     
  616. C     *CALL* TERM      
  617.       RETURN           
  618.    05 SIGN = MOD(PSTK(PT),256)            
  619.       KOUNT = PSTK(PT)/256                
  620.       PT = PT-1        
  621.       IF (SIGN .EQ. MINUS) CALL STACK1(MINUS)                
  622.       IF (ERR .GT. 0) RETURN              
  623.    10 IF (SYM.EQ.PLUS .OR. SYM.EQ.MINUS) GO TO 20            
  624.       GO TO 50         
  625.    20 IF (RSTK(PT) .NE. 10) GO TO 21      
  626. C     BLANK IS DELIMITER INSIDE ANGLE BRACKETS               
  627.       LS = LPT(3) - 2                     
  628.       IF (LIN(LS) .EQ. BLANK) GO TO 50    
  629.    21 OP = SYM         
  630.       CALL GETSYM      
  631.       PT = PT+1        
  632.       PSTK(PT) = OP + 256*KOUNT           
  633.       RSTK(PT) = 7     
  634. C     *CALL* TERM      
  635.       RETURN           
  636.    25 OP = MOD(PSTK(PT),256)              
  637.       KOUNT = PSTK(PT)/256                
  638.       PT = PT-1        
  639.       CALL STACK2(OP)                     
  640.       IF (ERR .GT. 0) RETURN              
  641.       GO TO 10         
  642.    50 IF (SYM .NE. COLON) GO TO 60        
  643.       CALL GETSYM      
  644.       KOUNT = KOUNT+1                     
  645.       GO TO 02         
  646.    60 IF (KOUNT .GT. 3) CALL ERROR(33)    
  647.       IF (ERR .GT. 0) RETURN              
  648.       RHS = KOUNT      
  649.       IF (KOUNT .GT. 1) CALL STACK2(COLON)                   
  650.       IF (ERR .GT. 0) RETURN              
  651.       RETURN           
  652.    99 CALL ERROR(22)   
  653.       IF (ERR .GT. 0) RETURN              
  654.       RETURN           
  655.       END
  656.               
  657.       SUBROUTINE FACTOR                   
  658.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  659.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  660.       INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ       
  661.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  662.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  663.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  664.       COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ               
  665.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  666.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  667.       INTEGER SEMI,EOL,BLANK,R,ID(4),EXCNT,LPAREN,RPAREN     
  668.       INTEGER STAR,DSTAR,COMMA,LESS,GREAT,QUOTE,NUM,NAME,ALFL                   
  669.       DATA DSTAR/54/,SEMI/39/,EOL/99/,BLANK/36/              
  670.       DATA STAR/43/,COMMA/48/,LPAREN/37/,RPAREN/38/          
  671.       DATA LESS/50/,GREAT/51/,QUOTE/49/,NUM/0/,NAME/1/,ALFL/52/                 
  672.       IF (DDT .EQ. 1) WRITE(WTE,100) PT,RSTK(PT),SYM         
  673.   100 FORMAT(1X,'FACTOR',3I4)             
  674.       R = RSTK(PT)     
  675.       GO TO (99,99,99,99,99,99,99,01,01,25,45,65,99,99,99,55,75,32,37),R        
  676.    01 IF (SYM.EQ.NUM .OR. SYM.EQ.QUOTE .OR.  SYM.EQ.LESS) GO TO 10              
  677.       IF (SYM .EQ. GREAT) GO TO 30        
  678.       EXCNT = 0        
  679.       IF (SYM .EQ. NAME) GO TO 40         
  680.       ID(1) = BLANK    
  681.       IF (SYM .EQ. LPAREN) GO TO 42       
  682.       CALL ERROR(2)    
  683.       IF (ERR .GT. 0) RETURN              
  684. C                      
  685. C     PUT SOMETHING ON THE STACK          
  686.    10 L = 1            
  687.       IF (TOP .GT. 0) L = LSTK(TOP) + MSTK(TOP)*NSTK(TOP)    
  688.       IF (TOP+1 .GE. BOT) CALL ERROR(18)  
  689.       IF (ERR .GT. 0) RETURN              
  690.       TOP = TOP+1      
  691.       LSTK(TOP) = L    
  692.       IF (SYM .EQ. QUOTE) GO TO 15        
  693.       IF (SYM .EQ. LESS) GO TO 20         
  694. C                      
  695. C     SINGLE NUMBER, GETSYM STORED IT IN STKI                
  696.       MSTK(TOP) = 1    
  697.       NSTK(TOP) = 1    
  698.       STKR(L) = STKI(VSIZE)               
  699.       STKI(L) = 0.0D0                     
  700.       CALL GETSYM      
  701.       GO TO 60         
  702. C                      
  703. C     STRING           
  704.    15 N = 0            
  705.       LPT(4) = LPT(3)                     
  706.       CALL GETCH       
  707.    16 IF (CHAR .EQ. QUOTE) GO TO 18       
  708.    17 LN = L+N         
  709.       IF (CHAR .EQ. EOL) CALL ERROR(31)   
  710.       IF (ERR .GT. 0) RETURN              
  711.       STKR(LN) = DFLOAT(CHAR)             
  712.       STKI(LN) = 0.0D0                    
  713.       N = N+1          
  714.       CALL GETCH       
  715.       GO TO 16         
  716.    18 CALL GETCH       
  717.       IF (CHAR .EQ. QUOTE) GO TO 17       
  718.       IF (N .LE. 0) CALL ERROR(31)        
  719.       IF (ERR .GT. 0) RETURN              
  720.       MSTK(TOP) = 1    
  721.       NSTK(TOP) = N    
  722.       CALL GETSYM      
  723.       GO TO 60         
  724. C                      
  725. C     EXPLICIT MATRIX                     
  726.    20 MSTK(TOP) = 0    
  727.       NSTK(TOP) = 0    
  728.    21 TOP = TOP + 1    
  729.       LSTK(TOP) = LSTK(TOP-1) + MSTK(TOP-1)*NSTK(TOP-1)      
  730.       MSTK(TOP) = 0    
  731.       NSTK(TOP) = 0    
  732.       CALL GETSYM      
  733.    22 IF (SYM.EQ.SEMI .OR. SYM.EQ.GREAT .OR. SYM.EQ.EOL) GO TO 27               
  734.       IF (SYM .EQ. COMMA) CALL GETSYM     
  735.       PT = PT+1        
  736.       RSTK(PT) = 10    
  737. C     *CALL* EXPR      
  738.       RETURN           
  739.    25 PT = PT-1        
  740.       TOP = TOP - 1    
  741.       IF (MSTK(TOP) .EQ. 0) MSTK(TOP) = MSTK(TOP+1)          
  742.       IF (MSTK(TOP) .NE. MSTK(TOP+1)) CALL ERROR(5)          
  743.       IF (ERR .GT. 0) RETURN              
  744.       NSTK(TOP) = NSTK(TOP) + NSTK(TOP+1)                    
  745.       GO TO 22         
  746.    27 IF (SYM.EQ.SEMI .AND. CHAR.EQ.EOL) CALL GETSYM         
  747.       CALL STACK1(QUOTE)                  
  748.       IF (ERR .GT. 0) RETURN              
  749.       TOP = TOP - 1    
  750.       IF (MSTK(TOP) .EQ. 0) MSTK(TOP) = MSTK(TOP+1)          
  751.       IF (MSTK(TOP).NE.MSTK(TOP+1) .AND. MSTK(TOP+1).GT.0) CALL ERROR(6)        
  752.       IF (ERR .GT. 0) RETURN              
  753.       NSTK(TOP) = NSTK(TOP) + NSTK(TOP+1)                    
  754.       IF (SYM .EQ. EOL) CALL GETLIN       
  755.       IF (SYM .NE. GREAT) GO TO 21        
  756.       CALL STACK1(QUOTE)                  
  757.       IF (ERR .GT. 0) RETURN              
  758.       CALL GETSYM      
  759.       GO TO 60         
  760. C                      
  761. C     MACRO STRING     
  762.    30 CALL GETSYM      
  763.       IF (SYM.EQ.LESS .AND. CHAR.EQ.EOL) CALL ERROR(28)      
  764.       IF (ERR .GT. 0) RETURN              
  765.       PT = PT+1        
  766.       RSTK(PT) = 18    
  767. C     *CALL* EXPR      
  768.       RETURN           
  769.    32 PT = PT-1        
  770.       IF (SYM.NE.LESS .AND. SYM.NE.EOL) CALL ERROR(37)       
  771.       IF (ERR .GT. 0) RETURN              
  772.       IF (SYM .EQ. LESS) CALL GETSYM      
  773.       K = LPT(6)       
  774.       LIN(K+1) = LPT(1)                   
  775.       LIN(K+2) = LPT(2)                   
  776.       LIN(K+3) = LPT(6)                   
  777.       LPT(1) = K + 4   
  778. C     TRANSFER STACK TO INPUT LINE        
  779.       K = LPT(1)       
  780.       L = LSTK(TOP)    
  781.       N = MSTK(TOP)*NSTK(TOP)             
  782.       DO 34 J = 1, N   
  783.          LS = L + J-1                     
  784.          LIN(K) = IDINT(STKR(LS))         
  785.          IF (LIN(K).LT.0 .OR. LIN(K).GE.ALFL) CALL ERROR(37) 
  786.          IF (ERR .GT. 0) RETURN           
  787.          IF (K.LT.1024) K = K+1           
  788.          IF (K.EQ.1024) WRITE(WTE,33) K   
  789.    33    FORMAT(1X,'INPUT BUFFER LIMIT IS ',I4,' CHARACTERS.')                  
  790.    34 CONTINUE         
  791.       TOP = TOP-1      
  792.       LIN(K) = EOL     
  793.       LPT(6) = K       
  794.       LPT(4) = LPT(1)                     
  795.       LPT(3) = 0       
  796.       LPT(2) = 0       
  797.       LCT(1) = 0       
  798.       CHAR = BLANK     
  799.       CALL GETSYM      
  800.       PT = PT+1        
  801.       RSTK(PT) = 19    
  802. C     *CALL* EXPR      
  803.       RETURN           
  804.    37 PT = PT-1        
  805.       K = LPT(1) - 4   
  806.       LPT(1) = LIN(K+1)                   
  807.       LPT(4) = LIN(K+2)                   
  808.       LPT(6) = LIN(K+3)                   
  809.       CHAR = BLANK     
  810.       CALL GETSYM      
  811.       GO TO 60         
  812. C                      
  813. C     FUNCTION OR MATRIX ELEMENT          
  814.    40 CALL PUTID(ID,SYN)                  
  815.       CALL GETSYM      
  816.       IF (SYM .EQ. LPAREN) GO TO 42       
  817.       RHS = 0          
  818.       CALL FUNS(ID)    
  819.       IF (FIN .NE. 0) CALL ERROR(25)      
  820.       IF (ERR .GT. 0) RETURN              
  821.       CALL STACKG(ID)                     
  822.       IF (ERR .GT. 0) RETURN              
  823.       IF (FIN .EQ. 7) GO TO 50            
  824.       IF (FIN .EQ. 0) CALL PUTID(IDS(1,PT+1),ID)             
  825.       IF (FIN .EQ. 0) CALL ERROR(4)       
  826.       IF (ERR .GT. 0) RETURN              
  827.       GO TO 60         
  828. C                      
  829.    42 CALL GETSYM      
  830.       EXCNT = EXCNT+1                     
  831.       PT = PT+1        
  832.       PSTK(PT) = EXCNT                    
  833.       CALL PUTID(IDS(1,PT),ID)            
  834.       RSTK(PT) = 11    
  835. C     *CALL* EXPR      
  836.       RETURN           
  837.    45 CALL PUTID(ID,IDS(1,PT))            
  838.       EXCNT = PSTK(PT)                    
  839.       PT = PT-1        
  840.       IF (SYM .EQ. COMMA) GO TO 42        
  841.       IF (SYM .NE. RPAREN) CALL ERROR(3)  
  842.       IF (ERR .GT. 0) RETURN              
  843.       IF (SYM .EQ. RPAREN) CALL GETSYM    
  844.       IF (ID(1) .EQ. BLANK) GO TO 60      
  845.       RHS = EXCNT      
  846.       CALL STACKG(ID)                     
  847.       IF (ERR .GT. 0) RETURN              
  848.       IF (FIN .EQ. 0) CALL FUNS(ID)       
  849.       IF (FIN .EQ. 0) CALL ERROR(4)       
  850.       IF (ERR .GT. 0) RETURN              
  851. C                      
  852. C     EVALUATE MATRIX FUNCTION            
  853.    50 PT = PT+1        
  854.       RSTK(PT) = 16    
  855. C     *CALL* MATFN     
  856.       RETURN           
  857.    55 PT = PT-1        
  858.       GO TO 60         
  859. C                      
  860. C     CHECK FOR QUOTE (TRANSPOSE) AND ** (POWER)             
  861.    60 IF (SYM .NE. QUOTE) GO TO 62        
  862.          I = LPT(3) - 2                   
  863.          IF (LIN(I) .EQ. BLANK) GO TO 90  
  864.          CALL STACK1(QUOTE)               
  865.          IF (ERR .GT. 0) RETURN           
  866.          CALL GETSYM   
  867.    62 IF (SYM.NE.STAR .OR. CHAR.NE.STAR) GO TO 90            
  868.       CALL GETSYM      
  869.       CALL GETSYM      
  870.       PT = PT+1        
  871.       RSTK(PT) = 12    
  872. C     *CALL* FACTOR    
  873.       GO TO 01         
  874.    65 PT = PT-1        
  875.       CALL STACK2(DSTAR)                  
  876.       IF (ERR .GT. 0) RETURN              
  877.       IF (FUN .NE. 2) GO TO 90            
  878. C     MATRIX POWER, USE EIGENVECTORS      
  879.       PT = PT+1        
  880.       RSTK(PT) = 17    
  881. C     *CALL* MATFN     
  882.       RETURN           
  883.    75 PT = PT-1        
  884.    90 RETURN           
  885.    99 CALL ERROR(22)   
  886.       IF (ERR .GT. 0) RETURN              
  887.       RETURN           
  888.       END
  889.               
  890.       SUBROUTINE FILES(LUNIT,NAME)        
  891.       INTEGER LUNIT              
  892. C                      
  893. C     AMIGA SPECIFIC ROUTINE TO ALLOCATE FILES             
  894. C     LUNIT = LOGICAL UNIT NUMBER         
  895. C     NAME = FILE NAME, 1 CHARACTER PER WORD                 
  896. C                      
  897.       character*1024 NAME
  898.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE       
  899.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE              
  900. C                      
  901. C  Amiga dependent stuff to squeeze the NAME from one char per word to one
  902. C  per byte
  903. C
  904.       character*1024 NAME2
  905.       integer*1 strip(4,256),strip2(32)
  906.       character*32 NAME3
  907.       equivalence (NAME2,strip),(NAME3,strip2)
  908. C
  909.       FE=0
  910. C
  911. C ERROR CATCHER
  912.       IF (LUNIT .EQ. 0) RETURN 
  913. C
  914. C PRINTER
  915.       if (LUNIT .eq. 6) return 
  916. C
  917. C TERMINAL I/O
  918.       if (LUNIT .eq. 9) return           
  919. C
  920. C HELP FILE
  921.       if (LUNIT .eq. 11) then              
  922.       OPEN(11,FILE='HELP.LIS',STATUS='OLD',ERR=14)
  923.          write(9,09)   
  924.    09    format(/1X,'HELP is available')  
  925.          return        
  926.       end if           
  927.       if (LUNIT .eq. -11 .AND. HIO .NE. 0) then             
  928.          rewind (11,ERR=99)      
  929.          return        
  930.       end if           
  931.       if (LUNIT .lt. 0) then              
  932.          close(unit=-LUNIT,ERR=99)               
  933.          return        
  934.       end if           
  935.    10 continue
  936. C
  937. C  ALL OTHER FILES
  938. C
  939.       NAME2=NAME
  940.       do 37 j=1,32
  941.    37 strip2(j)=strip(1,j)     
  942.       OPEN(UNIT=LUNIT,FILE=NAME3,STATUS='UNKNOWN',ERR=98) 
  943.       RETURN
  944.    14 WRITE(9,15)
  945. C
  946. C HELP FILE NOT FOUND
  947. C
  948.    15 FORMAT(1X,'HELP IS NOT AVAILABLE')
  949.       HIO = 0
  950.       RETURN           
  951. C
  952. C GENERAL FILE OPEN FAILURE
  953. C
  954.    98 WRITE(9,16)
  955.    16 FORMAT(1X,'OPEN FILE FAILED')
  956.       FE=1
  957.  
  958. C IF THIS WAS A DIARY FILE (OUTPUT), SET ITS FILE HANDLE TO 0 
  959.  
  960.       IF(LUNIT .EQ. 8) THEN
  961.         WIO=0
  962. C
  963. C OTHERWISE, SET THE I/O TO TERMINAL I/O
  964. C
  965.       ELSE
  966.         RIO=RTE
  967.       ENDIF
  968.       RETURN
  969.    99 CONTINUE
  970.       RETURN
  971.       END              
  972.                 
  973.       DOUBLE PRECISION FUNCTION FLOP(X)   
  974.       DOUBLE PRECISION X                  
  975. C     SYSTEM DEPENDENT FUNCTION           
  976. C     COUNT AND POSSIBLY CHOP EACH FLOATING POINT OPERATION  
  977. C     FLP(1) IS FLOP COUNTER              
  978. C     FLP(2) IS NUMBER OF PLACES TO BE CHOPPED               
  979. C                      
  980.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  981.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  982. C                      
  983.       DOUBLE PRECISION MASK(14),XX,MM     
  984.       real mas(2,14)   
  985.       LOGICAL LX(2),LM(2)                 
  986.       EQUIVALENCE (LX(1),XX),(LM(1),MM)   
  987.       equivalence (MASK(1),mas(1))        
  988.       data mas/        
  989.      $ Z'ffffffff',Z'fff0ffff',           
  990.      $ Z'ffffffff',Z'ff00ffff',           
  991.      $ Z'ffffffff',Z'f000ffff',           
  992.      $ Z'ffffffff',Z'0000ffff',           
  993.      $ Z'ffffffff',Z'0000fff0',           
  994.      $ Z'ffffffff',Z'0000ff00',           
  995.      $ Z'ffffffff',Z'0000f000',           
  996.      $ Z'ffffffff',Z'00000000',           
  997.      $ Z'fff0ffff',Z'00000000',           
  998.      $ Z'ff00ffff',Z'00000000',           
  999.      $ Z'f000ffff',Z'00000000',           
  1000.      $ Z'0000ffff',Z'00000000',           
  1001.      $ Z'0000fff0',Z'00000000',           
  1002.      $ Z'0000ff80',Z'00000000'/           
  1003. C                      
  1004.       FLP(1) = FLP(1) + 1                 
  1005.       K = FLP(2)       
  1006.       FLOP = X         
  1007.       IF (K .LE. 0) RETURN                
  1008.       FLOP = 0.0D0     
  1009.       IF (K .GE. 15) RETURN               
  1010.       XX = X           
  1011.       MM = MASK(K)     
  1012.       LX(1) = LX(1) .AND. LM(1)           
  1013.       LX(2) = LX(2) .AND. LM(2)           
  1014.       FLOP = XX        
  1015.       RETURN           
  1016.       END
  1017.              
  1018.       SUBROUTINE FORMZ(LUNIT,X,Y)         
  1019.       DOUBLE PRECISION X,Y                
  1020. C                      
  1021. C     SYSTEM DEPENDENT ROUTINE TO PRINT WITH Z FORMAT        
  1022. C                      
  1023.       IF (Y .NE. 0.0D0) WRITE(LUNIT,10) X,Y                  
  1024.       IF (Y .EQ. 0.0D0) WRITE(LUNIT,10) X                    
  1025.    10 FORMAT(2Z18)     
  1026.       RETURN           
  1027.       END
  1028.               
  1029.       SUBROUTINE FUNS(ID)                 
  1030.       INTEGER ID(4)    
  1031. C                      
  1032. C     SCAN FUNCTION LIST                  
  1033. C                      
  1034.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  1035.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  1036.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  1037.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  1038.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  1039.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  1040.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  1041.       LOGICAL EQID     
  1042.       INTEGER FUNL,FUNN(4,57),FUNP(57)    
  1043.       DATA FUNL/57/    
  1044. C                      
  1045. C    1  ABS   ATAN  BASE  CHAR            
  1046. C    2  CHOL  CHOP  COND  CONJ            
  1047. C    3  COS   DET   DIAG  DIAR            
  1048. C    4  DISP  EIG   EPS   EXEC            
  1049. C    5  EXP   EYE   FLOP  HESS            
  1050. C    6  HILB  IMAG  INV   KRON            
  1051. C    7  LINE  LOAD  LOG   LU              
  1052. C    8  MAGIC NORM  ONES  ORTH            
  1053. C    9  PINV  PLOT  POLY  PRINT           
  1054. C    $  PROD  QR    RAND  RANK            
  1055. C    1  RAT   RCOND REAL  ROOT            
  1056. C    2  ROUND RREF  SAVE  SCHUR           
  1057. C    3  SIN   SIZE  SQRT  SUM             
  1058. C    4  SVD   TRIL  TRIU  USER            
  1059. C    5  DEBUG          
  1060. C                      
  1061.       DATA FUNN/       
  1062.      1  10,11,28,36, 10,29,10,23, 11,10,28,14, 12,17,10,27,  
  1063.      2  12,17,24,21, 12,17,24,25, 12,24,23,13, 12,24,23,19,  
  1064.      3  12,24,28,36, 13,14,29,36, 13,18,10,16, 13,18,10,27,  
  1065.      4  13,18,28,25, 14,18,16,36, 14,25,28,36, 14,33,14,12,  
  1066.      5  14,33,25,36, 14,34,14,36, 15,21,24,25, 17,14,28,28,  
  1067.      6  17,18,21,11, 18,22,10,16, 18,23,31,36, 20,27,24,23,  
  1068.      7  21,18,23,14, 21,24,10,13, 21,24,16,36, 21,30,36,36,  
  1069.      8  22,10,16,18, 23,24,27,22, 24,23,14,28, 24,27,29,17,  
  1070.      9  25,18,23,31, 25,21,24,29, 25,24,21,34, 25,27,18,23,  
  1071.      $  25,27,24,13, 26,27,36,36, 27,10,23,13, 27,10,23,20,  
  1072.      1  27,10,29,36, 27,12,24,23, 27,14,10,21, 27,24,24,29,  
  1073.      2  27,24,30,23, 27,27,14,15, 28,10,31,14, 28,12,17,30,  
  1074.      3  28,18,23,36, 28,18,35,14, 28,26,27,29, 28,30,22,36,  
  1075.      4  28,31,13,36, 29,27,18,21, 29,27,18,30, 30,28,14,27,  
  1076.      5  13,14,11,30/   
  1077. C                      
  1078.       DATA FUNP/       
  1079.      1  221,203,507,509, 106,609,303,225, 202,102,602,505,   
  1080.      4  506,211,000,501, 204,606,000,213, 105,224,101,611,   
  1081.      7  508,503,206,104, 601,304,608,402, 302,510,214,504,   
  1082.      $  604,401,607,305, 511,103,223,215, 222,107,502,212,   
  1083.      3  201,610,205,603, 301,614,615,605, 512/               
  1084. C                      
  1085.       IF (ID(1).EQ.0) CALL PRNTID(FUNN,FUNL-1)               
  1086.       IF (ID(1).EQ.0) RETURN              
  1087. C                      
  1088.       DO 10 K = 1, FUNL                   
  1089.          IF (EQID(ID,FUNN(1,K))) GO TO 20                    
  1090.    10 CONTINUE         
  1091.       FIN = 0          
  1092.       RETURN           
  1093. C                      
  1094.    20 FIN = MOD(FUNP(K),100)              
  1095.       FUN = FUNP(K)/100                   
  1096.       IF (RHS.EQ.0 .AND. FUNP(K).EQ.606) FIN = 0             
  1097.       IF (RHS.EQ.0 .AND. FUNP(K).EQ.607) FIN = 0             
  1098.       RETURN           
  1099.       END
  1100.               
  1101.       SUBROUTINE GETCH                    
  1102. C     GET NEXT CHARACTER                  
  1103.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  1104.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  1105.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  1106.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  1107.       INTEGER EOL      
  1108.       DATA EOL/99/     
  1109.       L = LPT(4)       
  1110.       CHAR = LIN(L)    
  1111.       IF (CHAR .NE. EOL) LPT(4) = L + 1   
  1112.       RETURN           
  1113.       END 
  1114.               
  1115.       SUBROUTINE GETLIN                   
  1116. C     GET A NEW LINE   
  1117.       INTEGER ALFA(52),ALFB(52),ALFL,CASE                    
  1118.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  1119.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  1120.       COMMON /ALFS/ ALFA,ALFB,ALFL,CASE   
  1121.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  1122.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  1123.       INTEGER LRECL,EOL,SLASH,BSLASH,DOT,BLANK,RETU(4)       
  1124.       DATA EOL/99/,DOT/47/,BLANK/36/,RETU/27,14,29,30/       
  1125.       DATA SLASH/44/,BSLASH/45/,LRECL/80/                    
  1126. C                      
  1127.    10 L = LPT(1)       
  1128.    11 DO 12 J = 1, LRECL                  
  1129.          BUF(J) = ALFA(BLANK+1)           
  1130.    12 CONTINUE         
  1131.       READ(RIO,101,END=50,ERR=15) (BUF(J),J=1,LRECL)         
  1132. CDC.. IF (EOF(RIO).NE.0) GO TO 50         
  1133.   101 FORMAT(80A1)     
  1134.       N = LRECL+1      
  1135.    15 N = N-1          
  1136.       IF (BUF(N) .EQ. ALFA(BLANK+1)) GO TO 15                
  1137.       IF (MOD(LCT(4),2) .EQ. 1) WRITE(WTE,102) (BUF(J),J=1,N)                   
  1138.       IF (WIO .NE. 0) WRITE(WIO,102) (BUF(J),J=1,N)          
  1139.   102 FORMAT(1X,80A1)                     
  1140. C                      
  1141.       DO 40 J = 1, N   
  1142.          DO 20 K = 1, ALFL                
  1143.            IF (BUF(J).EQ.ALFA(K) .OR. BUF(J).EQ.ALFB(K)) GO TO 30               
  1144.    20    CONTINUE      
  1145.          K = EOL+1     
  1146.          CALL XCHAR(BUF(J),K)             
  1147.          IF (K .GT. EOL) GO TO 10         
  1148.          IF (K .EQ. EOL) GO TO 45         
  1149.          IF (K .EQ. -1) L = L-1           
  1150.          IF (K .LE. 0) GO TO 40           
  1151. C                      
  1152.    30    K = K-1       
  1153.          IF (K.EQ.SLASH .AND. BUF(J+1).EQ.BUF(J)) GO TO 45   
  1154.          IF (K.EQ.DOT .AND. BUF(J+1).EQ.BUF(J)) GO TO 11     
  1155.          IF (K.EQ.BSLASH .AND. N.EQ.1) GO TO 60              
  1156.          LIN(L) = K    
  1157.          IF (L.LT.1024) L = L+1           
  1158.          IF (L.EQ.1024) WRITE(WTE,33) L   
  1159.    33    FORMAT(1X,'INPUT BUFFER LIMIT IS ',I4,' CHARACTERS.')                  
  1160.    40 CONTINUE         
  1161.    45 LIN(L) = EOL     
  1162.       LPT(6) = L       
  1163.       LPT(4) = LPT(1)                     
  1164.       LPT(3) = 0       
  1165.       LPT(2) = 0       
  1166.       LCT(1) = 0       
  1167.       CALL GETCH       
  1168.       RETURN           
  1169. C                      
  1170.    50 IF (RIO .EQ. RTE) GO TO 52          
  1171.       CALL PUTID(LIN(L),RETU)             
  1172.       L = L + 4        
  1173.       GO TO 45         
  1174.    52 CALL FILES(-1*RTE,BUF)                
  1175.       LIN(L) = EOL     
  1176.       RETURN           
  1177. C                      
  1178.    60 N = LPT(6) - LPT(1)                 
  1179.       DO 61 I = 1, N   
  1180.          J = L+I-1     
  1181.          K = LIN(J)    
  1182.          BUF(I) = ALFA(K+1)               
  1183.          IF (CASE.EQ.1 .AND. K.LT.36) BUF(I) = ALFB(K+1)     
  1184.    61 CONTINUE         
  1185.       CALL EDIT(BUF,N)                    
  1186.       N = N + 1        
  1187.       GO TO 15         
  1188.       END
  1189.               
  1190.       SUBROUTINE GETSYM                   
  1191. C     GET A SYMBOL     
  1192.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  1193.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  1194.       INTEGER ALFA(52),ALFB(52),ALFL,CASE                    
  1195.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  1196.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  1197.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  1198.       COMMON /ALFS/ ALFA,ALFB,ALFL,CASE   
  1199.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  1200.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  1201.       DOUBLE PRECISION SYV,S,FLOP         
  1202.       INTEGER BLANK,Z,DOT,D,E,PLUS,MINUS,NAME,NUM,SIGN,CHCNT,EOL                
  1203.       INTEGER STAR,SLASH,BSLASH,SS        
  1204.       DATA BLANK/36/,Z/35/,DOT/47/,D/13/,E/14/,EOL/99/,PLUS/41/                 
  1205.       DATA MINUS/42/,NAME/1/,NUM/0/,STAR/43/,SLASH/44/,BSLASH/45/               
  1206.    10 IF (CHAR .NE. BLANK) GO TO 20       
  1207.       CALL GETCH       
  1208.       GO TO 10         
  1209.    20 LPT(2) = LPT(3)                     
  1210.       LPT(3) = LPT(4)                     
  1211.       IF (CHAR .LE. 9) GO TO 50           
  1212.       IF (CHAR .LE. Z) GO TO 30           
  1213. C                      
  1214. C     SPECIAL CHARACTER                   
  1215.       SS = SYM         
  1216.       SYM = CHAR       
  1217.       CALL GETCH       
  1218.       IF (SYM .NE. DOT) GO TO 90          
  1219. C                      
  1220. C     IS DOT PART OF NUMBER OR OPERATOR   
  1221.       SYV = 0.0D0      
  1222.       IF (CHAR .LE. 9) GO TO 55           
  1223.       IF (CHAR.EQ.STAR .OR. CHAR.EQ.SLASH .OR. CHAR.EQ.BSLASH) GO TO 90         
  1224.       IF (SS.EQ.STAR .OR. SS.EQ.SLASH .OR. SS.EQ.BSLASH) GO TO 90               
  1225.       GO TO 55         
  1226. C                      
  1227. C     NAME             
  1228.    30 SYM = NAME       
  1229.       SYN(1) = CHAR    
  1230.       CHCNT = 1        
  1231.    40 CALL GETCH       
  1232.       CHCNT = CHCNT+1                     
  1233.       IF (CHAR .GT. Z) GO TO 45           
  1234.       IF (CHCNT .LE. 4) SYN(CHCNT) = CHAR                    
  1235.       GO TO 40         
  1236.    45 IF (CHCNT .GT. 4) GO TO 47          
  1237.       DO 46 I = CHCNT, 4                  
  1238.    46 SYN(I) = BLANK   
  1239.    47 CONTINUE         
  1240.       GO TO 90         
  1241. C                      
  1242. C     NUMBER           
  1243.    50 CALL GETVAL(SYV)                    
  1244.       IF (CHAR .NE. DOT) GO TO 60         
  1245.       CALL GETCH       
  1246.    55 CHCNT = LPT(4)   
  1247.       CALL GETVAL(S)   
  1248.       CHCNT = LPT(4) - CHCNT              
  1249.       IF (CHAR .EQ. EOL) CHCNT = CHCNT+1  
  1250.       SYV = SYV + S/10.0D0**CHCNT         
  1251.    60 IF (CHAR.NE.D .AND. CHAR.NE.E) GO TO 70                
  1252.       CALL GETCH       
  1253.       SIGN = CHAR      
  1254.       IF (SIGN.EQ.MINUS .OR. SIGN.EQ.PLUS) CALL GETCH        
  1255.       CALL GETVAL(S)   
  1256.       IF (SIGN .NE. MINUS) SYV = SYV*10.0D0**S               
  1257.       IF (SIGN .EQ. MINUS) SYV = SYV/10.0D0**S               
  1258.    70 STKI(VSIZE) = FLOP(SYV)             
  1259.       SYM = NUM        
  1260. C                      
  1261.    90 IF (CHAR .NE. BLANK) GO TO 99       
  1262.       CALL GETCH       
  1263.       GO TO 90         
  1264.    99 IF (DDT .NE. 1) RETURN              
  1265.       IF (SYM.GT.NAME .AND. SYM.LT.ALFL) WRITE(WTE,197) ALFA(SYM+1)             
  1266.       IF (SYM .GE. ALFL) WRITE(WTE,198)   
  1267.       IF (SYM .EQ. NAME) CALL PRNTID(SYN,1)                  
  1268.       IF (SYM .EQ. NUM) WRITE(WTE,199) SYV                   
  1269.   197 FORMAT(1X,A1)    
  1270.   198 FORMAT(1X,'EOL')                    
  1271.   199 FORMAT(1X,G8.2)                     
  1272.       RETURN           
  1273.       END
  1274.              
  1275.       SUBROUTINE GETVAL(S)                
  1276.       DOUBLE PRECISION S                  
  1277. C     FORM NUMERICAL VALUE                
  1278.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  1279.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  1280.       S = 0.0D0        
  1281.    10 IF (CHAR .GT. 9) RETURN             
  1282.       S = 10.0D0*S + CHAR                 
  1283.       CALL GETCH       
  1284.       GO TO 10         
  1285.       END
  1286.               
  1287.       SUBROUTINE MATFN1                   
  1288. C                      
  1289. C     EVALUATE FUNCTIONS INVOLVING GAUSSIAN ELIMINATION      
  1290. C                      
  1291.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  1292.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  1293.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  1294.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  1295.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  1296.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  1297.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  1298.       DOUBLE PRECISION DTR(2),DTI(2),SR,SI,RCOND,T,T0,T1,FLOP,EPS,WASUM         
  1299. C                      
  1300.       IF (DDT .EQ. 1) WRITE(WTE,100) FIN  
  1301.   100 FORMAT(1X,'MATFN1',I4)              
  1302. C                      
  1303.       L = LSTK(TOP)    
  1304.       M = MSTK(TOP)    
  1305.       N = NSTK(TOP)    
  1306.       IF (FIN .EQ. -1) GO TO 10           
  1307.       IF (FIN .EQ. -2) GO TO 20           
  1308.       GO TO (30,40,50,60,70,80,85),FIN    
  1309. C                      
  1310. C     MATRIX RIGHT DIVISION, A/A2         
  1311.    10 L2 = LSTK(TOP+1)                    
  1312.       M2 = MSTK(TOP+1)                    
  1313.       N2 = NSTK(TOP+1)                    
  1314.       IF (M2 .NE. N2) CALL ERROR(20)      
  1315.       IF (ERR .GT. 0) RETURN              
  1316.       IF (M*N .EQ. 1) GO TO 16            
  1317.       IF (N .NE. N2) CALL ERROR(11)       
  1318.       IF (ERR .GT. 0) RETURN              
  1319.       L3 = L2 + M2*N2                     
  1320.       ERR = L3+N2 - LSTK(BOT)             
  1321.       IF (ERR .GT. 0) CALL ERROR(17)      
  1322.       IF (ERR .GT. 0) RETURN              
  1323.       CALL WGECO(STKR(L2),STKI(L2),M2,N2,BUF,RCOND,STKR(L3),STKI(L3))           
  1324.       IF (RCOND .EQ. 0.0D0) CALL ERROR(19)                   
  1325.       IF (ERR .GT. 0) RETURN              
  1326.       T = FLOP(1.0D0 + RCOND)             
  1327.       IF (T.EQ.1.0D0 .AND. FUN.NE.21) WRITE(WTE,11) RCOND    
  1328.       IF (T.EQ.1.0D0 .AND. FUN.NE.21 .AND. WIO.NE.0) WRITE(WIO,11) RCOND        
  1329.    11 FORMAT(1X,'WARNING.'                
  1330.      $  /1X,'MATRIX IS CLOSE TO SINGULAR OR BADLY SCALED.'   
  1331.      $  /1X,'RESULTS MAY BE INACCURATE.  RCOND =', 1PD13.4/) 
  1332.       IF (T.EQ.1.0D0 .AND. FUN.EQ.21) WRITE(WTE,12) RCOND    
  1333.       IF (T.EQ.1.0D0 .AND. FUN.EQ.21 .AND. WIO.NE.0) WRITE(WIO,12) RCOND        
  1334.    12 FORMAT(1X,'WARNING.'                
  1335.      $  /1X,'EIGENVECTORS ARE BADLY CONDITIONED.'            
  1336.      $  /1X,'RESULTS MAY BE INACCURATE.  RCOND =', 1PD13.4/) 
  1337.       DO 15 I = 1, M   
  1338.          DO 13 J = 1, N                   
  1339.             LS = L+I-1+(J-1)*M            
  1340.             LL = L3+J-1                   
  1341.             STKR(LL) = STKR(LS)           
  1342.             STKI(LL) = -STKI(LS)          
  1343.    13    CONTINUE      
  1344.          CALL WGESL(STKR(L2),STKI(L2),M2,N2,BUF,STKR(L3),STKI(L3),1)            
  1345.          DO 14 J = 1, N                   
  1346.             LL = L+I-1+(J-1)*M            
  1347.             LS = L3+J-1                   
  1348.             STKR(LL) = STKR(LS)           
  1349.             STKI(LL) = -STKI(LS)          
  1350.    14    CONTINUE      
  1351.    15 CONTINUE         
  1352.       IF (FUN .NE. 21) GO TO 99           
  1353. C                      
  1354. C     CHECK FOR IMAGINARY ROUNDOFF IN MATRIX FUNCTIONS       
  1355.       SR = WASUM(N*N,STKR(L),STKR(L),1)   
  1356.       SI = WASUM(N*N,STKI(L),STKI(L),1)   
  1357.       EPS = STKR(VSIZE-4)                 
  1358.       T = EPS*SR       
  1359.       IF (DDT .EQ. 18) WRITE(WTE,115) SR,SI,EPS,T            
  1360.   115 FORMAT(1X,'SR,SI,EPS,T',1P4D13.4)   
  1361.       IF (SI .LE. EPS*SR) CALL RSET(N*N,0.0D0,STKI(L),1)     
  1362.       GO TO 99         
  1363. C                      
  1364.    16 SR = STKR(L)     
  1365.       SI = STKI(L)     
  1366.       N = N2           
  1367.       M = N            
  1368.       MSTK(TOP) = N    
  1369.       NSTK(TOP) = N    
  1370.       CALL WCOPY(N*N,STKR(L2),STKI(L2),1,STKR(L),STKI(L),1)  
  1371.       GO TO 30         
  1372. C                      
  1373. C     MATRIX LEFT DIVISION A BACKSLASH A2                    
  1374.    20 L2 = LSTK(TOP+1)                    
  1375.       M2 = MSTK(TOP+1)                    
  1376.       N2 = NSTK(TOP+1)                    
  1377.       IF (M .NE. N) CALL ERROR(20)        
  1378.       IF (ERR .GT. 0) RETURN              
  1379.       IF (M2*N2 .EQ. 1) GO TO 26          
  1380.       L3 = L2 + M2*N2                     
  1381.       ERR = L3+N - LSTK(BOT)              
  1382.       IF (ERR .GT. 0) CALL ERROR(17)      
  1383.       IF (ERR .GT. 0) RETURN              
  1384.       CALL WGECO(STKR(L),STKI(L),M,N,BUF,RCOND,STKR(L3),STKI(L3))               
  1385.       IF (RCOND .EQ. 0.0D0) CALL ERROR(19)                   
  1386.       IF (ERR .GT. 0) RETURN              
  1387.       T = FLOP(1.0D0 + RCOND)             
  1388.       IF (T .EQ. 1.0D0) WRITE(WTE,11) RCOND                  
  1389.       IF (T.EQ.1.0D0 .AND. WIO.NE.0) WRITE(WIO,11) RCOND     
  1390.       IF (M2 .NE. N) CALL ERROR(12)       
  1391.       IF (ERR .GT. 0) RETURN              
  1392.       DO 23 J = 1, N2                     
  1393.          LJ = L2+(J-1)*M2                 
  1394.          CALL WGESL(STKR(L),STKI(L),M,N,BUF,STKR(LJ),STKI(LJ),0)                
  1395.    23 CONTINUE         
  1396.       NSTK(TOP) = N2   
  1397.       CALL WCOPY(M2*N2,STKR(L2),STKI(L2),1,STKR(L),STKI(L),1)                   
  1398.       GO TO 99         
  1399.    26 SR = STKR(L2)    
  1400.       SI = STKI(L2)    
  1401.       GO TO 30         
  1402. C                      
  1403. C     INV              
  1404. C                      
  1405.    30 IF (M .NE. N) CALL ERROR(20)        
  1406.       IF (ERR .GT. 0) RETURN              
  1407.       IF (DDT .EQ. 17) GO TO 32           
  1408.       DO 31 J = 1, N   
  1409.       DO 31 I = 1, N   
  1410.         LS = L+I-1+(J-1)*N                
  1411.         T0 = STKR(LS)                     
  1412.         T1 = FLOP(1.0D0/(DFLOAT(I+J-1)))  
  1413.         IF (T0 .NE. T1) GO TO 32          
  1414.    31 CONTINUE         
  1415.       GO TO 72         
  1416.    32 L3 = L + N*N     
  1417.       ERR = L3+N - LSTK(BOT)              
  1418.       IF (ERR .GT. 0) CALL ERROR(17)      
  1419.       IF (ERR .GT. 0) RETURN              
  1420.       CALL WGECO(STKR(L),STKI(L),M,N,BUF,RCOND,STKR(L3),STKI(L3))               
  1421.       IF (RCOND .EQ. 0.0D0) CALL ERROR(19)                   
  1422.       IF (ERR .GT. 0) RETURN              
  1423.       T = FLOP(1.0D0 + RCOND)             
  1424.       IF (T .EQ. 1.0D0) WRITE(WTE,11) RCOND                  
  1425.       IF (T.EQ.1.0D0 .AND. WIO.NE.0) WRITE(WIO,11) RCOND     
  1426.       CALL WGEDI(STKR(L),STKI(L),M,N,BUF,DTR,DTI,STKR(L3),STKI(L3),1)           
  1427.       IF (FIN .LT. 0) CALL WSCAL(N*N,SR,SI,STKR(L),STKI(L),1)                   
  1428.       GO TO 99         
  1429. C                      
  1430. C     DET              
  1431. C                      
  1432.    40 IF (M .NE. N) CALL ERROR(20)        
  1433.       IF (ERR .GT. 0) RETURN              
  1434.       CALL WGEFA(STKR(L),STKI(L),M,N,BUF,INFO)               
  1435.       CALL WGEDI(STKR(L),STKI(L),M,N,BUF,DTR,DTI,SR,SI,10)   
  1436.       K = IDINT(DTR(2))                   
  1437.       KA = IABS(K)+2   
  1438.       T = 1.0D0        
  1439.       DO 41 I = 1, KA                     
  1440.          T = T/10.0D0                     
  1441.          IF (T .EQ. 0.0D0) GO TO 42       
  1442.    41 CONTINUE         
  1443.       STKR(L) = DTR(1)*10.D0**K           
  1444.       STKI(L) = DTI(1)*10.D0**K           
  1445.       MSTK(TOP) = 1    
  1446.       NSTK(TOP) = 1    
  1447.       GO TO 99         
  1448.    42 IF (DTI(1) .EQ. 0.0D0) WRITE(WTE,43) DTR(1),K          
  1449.       IF (DTI(1) .NE. 0.0D0) WRITE(WTE,44) DTR(1),DTI(1),K   
  1450.    43 FORMAT(1X,'DET =  ',F7.4,7H * 10**,I4)                 
  1451.    44 FORMAT(1X,'DET =  ',F7.4,' + ',F7.4,' i ',7H * 10**,I4)                   
  1452.       STKR(L) = DTR(1)                    
  1453.       STKI(L) = DTI(1)                    
  1454.       STKR(L+1) = DTR(2)                  
  1455.       STKI(L+1) = 0.0D0                   
  1456.       MSTK(TOP) = 1    
  1457.       NSTK(TOP) = 2    
  1458.       GO TO 99         
  1459. C                      
  1460. C     RCOND            
  1461. C                      
  1462.    50 IF (M .NE. N) CALL ERROR(20)        
  1463.       IF (ERR .GT. 0) RETURN              
  1464.       L3 = L + N*N     
  1465.       ERR = L3+N - LSTK(BOT)              
  1466.       IF (ERR .GT. 0) CALL ERROR(17)      
  1467.       IF (ERR .GT. 0) RETURN              
  1468.       CALL WGECO(STKR(L),STKI(L),M,N,BUF,RCOND,STKR(L3),STKI(L3))               
  1469.       STKR(L) = RCOND                     
  1470.       STKI(L) = 0.0D0                     
  1471.       MSTK(TOP) = 1    
  1472.       NSTK(TOP) = 1    
  1473.       IF (LHS .EQ. 1) GO TO 99            
  1474.       L = L + 1        
  1475.       CALL WCOPY(N,STKR(L3),STKI(L3),1,STKR(L),STKI(L),1)    
  1476.       TOP = TOP + 1    
  1477.       LSTK(TOP) = L    
  1478.       MSTK(TOP) = N    
  1479.       NSTK(TOP) = 1    
  1480.       GO TO 99         
  1481. C                      
  1482. C     LU               
  1483. C                      
  1484.    60 IF (M .NE. N) CALL ERROR(20)        
  1485.       IF (ERR .GT. 0) RETURN              
  1486.       CALL WGEFA(STKR(L),STKI(L),M,N,BUF,INFO)               
  1487.       IF (LHS .NE. 2) GO TO 99            
  1488.       NN = N*N         
  1489.       IF (TOP+1 .GE. BOT) CALL ERROR(18)  
  1490.       IF (ERR .GT. 0) RETURN              
  1491.       TOP = TOP+1      
  1492.       LSTK(TOP) = L + NN                  
  1493.       MSTK(TOP) = N    
  1494.       NSTK(TOP) = N    
  1495.       ERR = L+NN+NN - LSTK(BOT)           
  1496.       IF (ERR .GT. 0) CALL ERROR(17)      
  1497.       IF (ERR .GT. 0) RETURN              
  1498.       DO 64 KB = 1, N                     
  1499.         K = N+1-KB     
  1500.         DO 61 I = 1, N                    
  1501.           LL = L+I-1+(K-1)*N              
  1502.           LU = LL + NN                    
  1503.           IF (I .LE. K) STKR(LU) = STKR(LL)                  
  1504.           IF (I .LE. K) STKI(LU) = STKI(LL)                  
  1505.           IF (I .GT. K) STKR(LU) = 0.0D0  
  1506.           IF (I .GT. K) STKI(LU) = 0.0D0  
  1507.           IF (I .LT. K) STKR(LL) = 0.0D0  
  1508.           IF (I .LT. K) STKI(LL) = 0.0D0  
  1509.           IF (I .EQ. K) STKR(LL) = 1.0D0  
  1510.           IF (I .EQ. K) STKI(LL) = 0.0D0  
  1511.           IF (I .GT. K) STKR(LL) = -STKR(LL)                 
  1512.           IF (I .GT. K) STKI(LL) = -STKI(LL)                 
  1513.    61   CONTINUE       
  1514.         I = BUF(K)     
  1515.         IF (I .EQ. K) GO TO 64            
  1516.         LI = L+I-1+(K-1)*N                
  1517.         LK = L+K-1+(K-1)*N                
  1518.         CALL WSWAP(N-K+1,STKR(LI),STKI(LI),N,STKR(LK),STKI(LK),N)               
  1519.    64 CONTINUE         
  1520.       GO TO 99         
  1521. C                      
  1522. C     HILBERT          
  1523.    70 N = IDINT(STKR(L))                  
  1524.       MSTK(TOP) = N    
  1525.       NSTK(TOP) = N    
  1526.    72 CALL HILBER(STKR(L),N,N)            
  1527.       CALL RSET(N*N,0.0D0,STKI(L),1)      
  1528.       IF (FIN .LT. 0) CALL WSCAL(N*N,SR,SI,STKR(L),STKI(L),1)                   
  1529.       GO TO 99         
  1530. C                      
  1531. C     CHOLESKY         
  1532.    80 IF (M .NE. N) CALL ERROR(20)        
  1533.       IF (ERR .GT. 0) RETURN              
  1534.       CALL WPOFA(STKR(L),STKI(L),M,N,ERR)                    
  1535.       IF (ERR .NE. 0) CALL ERROR(29)      
  1536.       IF (ERR .GT. 0) RETURN              
  1537.       DO 81 J = 1, N   
  1538.         LL = L+J+(J-1)*M                  
  1539.         CALL WSET(M-J,0.0D0,0.0D0,STKR(LL),STKI(LL),1)       
  1540.    81 CONTINUE         
  1541.       GO TO 99         
  1542. C                      
  1543. C     RREF             
  1544.    85 IF (RHS .LT. 2) GO TO 86            
  1545.         TOP = TOP-1    
  1546.         L = LSTK(TOP)                     
  1547.         IF (MSTK(TOP) .NE. M) CALL ERROR(5)                  
  1548.         IF (ERR .GT. 0) RETURN            
  1549.         N = N + NSTK(TOP)                 
  1550.    86 CALL RREF(STKR(L),STKI(L),M,M,N,STKR(VSIZE-4))         
  1551.       NSTK(TOP) = N    
  1552.       GO TO 99         
  1553. C                      
  1554.    99 RETURN           
  1555.       END              
  1556.              
  1557.          SUBROUTINE MATFN2                   
  1558. C                      
  1559. C     EVALUATE ELEMENTARY FUNCTIONS AND FUNCTIONS INVOLVING  
  1560. C     EIGENVALUES AND EIGENVECTORS        
  1561. C                      
  1562.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  1563.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  1564.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  1565.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  1566.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  1567.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  1568.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  1569.       DOUBLE PRECISION PYTHAG,ROUND,TR,TI,SR,SI,POWR,POWI,FLOP                  
  1570.       LOGICAL HERM,SCHUR,VECT,HESS        
  1571. C                      
  1572.       IF (DDT .EQ. 1) WRITE(WTE,100) FIN  
  1573.   100 FORMAT(1X,'MATFN2',I4)              
  1574. C                      
  1575. C     FUNCTIONS/FIN    
  1576. C     **   SIN  COS ATAN  EXP  SQRT LOG   
  1577. C      0    1    2    3    4    5    6    
  1578. C    EIG  SCHU HESS POLY ROOT             
  1579. C     11   12   13   14   15              
  1580. C    ABS  ROUN REAL IMAG CONJ             
  1581. C     21   22   23   24   25              
  1582.       IF (FIN .NE. 0) GO TO 05            
  1583.          L = LSTK(TOP+1)                  
  1584.          POWR = STKR(L)                   
  1585.          POWI = STKI(L)                   
  1586.    05 L = LSTK(TOP)    
  1587.       M = MSTK(TOP)    
  1588.       N = NSTK(TOP)    
  1589.       IF (FIN .GE. 11 .AND. FIN .LE. 13) GO TO 10            
  1590.       IF (FIN .EQ. 14 .AND. (M.EQ.1 .OR. N.EQ.1)) GO TO 50   
  1591.       IF (FIN .EQ. 14) GO TO 10           
  1592.       IF (FIN .EQ. 15) GO TO 60           
  1593.       IF (FIN .GT. 20) GO TO 40           
  1594.       IF (M .EQ. 1 .OR. N .EQ. 1) GO TO 40                   
  1595. C                      
  1596. C     EIGENVALUES AND VECTORS             
  1597.    10 IF (M .NE. N) CALL ERROR(20)        
  1598.       IF (ERR .GT. 0) RETURN              
  1599.       SCHUR = FIN .EQ. 12                 
  1600.       HESS = FIN .EQ. 13                  
  1601.       VECT = LHS.EQ.2 .OR. FIN.LT.10      
  1602.       NN = N*N         
  1603.       L2 = L + NN      
  1604.       LD = L2 + NN     
  1605.       LE = LD + N      
  1606.       LW = LE + N      
  1607.       ERR = LW+N - LSTK(BOT)              
  1608.       IF (ERR .GT. 0) CALL ERROR(17)      
  1609.       IF (ERR .GT. 0) RETURN              
  1610.       CALL WCOPY(NN,STKR(L),STKI(L),1,STKR(L2),STKI(L2),1)   
  1611. C                      
  1612. C     CHECK IF HERMITIAN                  
  1613.       DO 15 J = 1, N   
  1614.       DO 15 I = 1, J   
  1615.          LS = L+I-1+(J-1)*N               
  1616.          LL = L+(I-1)*N+J-1               
  1617.          HERM = STKR(LL).EQ.STKR(LS) .AND. STKI(LL).EQ.-STKI(LS)                
  1618.          IF (.NOT. HERM) GO TO 30         
  1619.    15 CONTINUE         
  1620. C                      
  1621. C     HERMITIAN EIGENVALUE PROBLEM        
  1622.       CALL WSET(NN,0.0D0,0.0D0,STKR(L),STKI(L),1)            
  1623.       CALL WSET(N,1.0D0,0.0D0,STKR(L),STKI(L),N+1)           
  1624.       CALL WSET(N,0.0D0,0.0D0,STKI(LD),STKI(LE),1)           
  1625.       JOB = 0          
  1626.       IF (VECT) JOB = 1                   
  1627.       CALL HTRIDI(N,N,STKR(L2),STKI(L2),STKR(LD),STKR(LE),   
  1628.      $            STKR(LE),STKR(LW))      
  1629.       IF (.NOT.HESS) CALL IMTQL2(N,N,STKR(LD),STKR(LE),STKR(L),ERR,JOB)         
  1630.       IF (ERR .GT. 0) CALL ERROR(24)      
  1631.       IF (ERR .GT. 0) RETURN              
  1632.       IF (JOB .NE. 0)                     
  1633.      $  CALL HTRIBK(N,N,STKR(L2),STKI(L2),STKR(LW),N,STKR(L),STKI(L))           
  1634.       GO TO 31         
  1635. C                      
  1636. C     NON-HERMITIAN EIGENVALUE PROBLEM    
  1637.    30 CALL CORTH(N,N,1,N,STKR(L2),STKI(L2),STKR(LW),STKI(LW))                   
  1638.       IF (.NOT.VECT .AND. HESS) GO TO 31  
  1639.       JOB = 0          
  1640.       IF (VECT) JOB = 2                   
  1641.       IF (VECT .AND. SCHUR) JOB = 1       
  1642.       IF (HESS) JOB = 3                   
  1643.       CALL COMQR3(N,N,1,N,STKR(LW),STKI(LW),STKR(L2),STKI(L2),                  
  1644.      $            STKR(LD),STKI(LD),STKR(L),STKI(L),ERR,JOB) 
  1645.       IF (ERR .GT. 0) CALL ERROR(24)      
  1646.       IF (ERR .GT. 0) RETURN              
  1647. C                      
  1648. C     VECTORS          
  1649.    31 IF (.NOT.VECT) GO TO 34             
  1650.       IF (TOP+1 .GE. BOT) CALL ERROR(18)  
  1651.       IF (ERR .GT. 0) RETURN              
  1652.       TOP = TOP+1      
  1653.       LSTK(TOP) = L2   
  1654.       MSTK(TOP) = N    
  1655.       NSTK(TOP) = N    
  1656. C                      
  1657. C     DIAGONAL OF VALUES OR CANONICAL FORMS                  
  1658.    34 IF (.NOT.VECT .AND. .NOT.SCHUR .AND. .NOT.HESS) GO TO 37                  
  1659.       DO 36 J = 1, N   
  1660.          LJ = L2+(J-1)*N                  
  1661.          IF (SCHUR .AND. (.NOT.HERM)) LJ = LJ+J              
  1662.          IF (HESS .AND. (.NOT.HERM)) LJ = LJ+J+1             
  1663.          LL = L2+J*N-LJ                   
  1664.          CALL WSET(LL,0.0D0,0.0D0,STKR(LJ),STKI(LJ),1)       
  1665.    36 CONTINUE         
  1666.       IF (.NOT.HESS .OR. HERM)            
  1667.      $   CALL WCOPY(N,STKR(LD),STKI(LD),1,STKR(L2),STKI(L2),N+1)                
  1668.       LL = L2+1        
  1669.       IF (HESS .AND. HERM)                
  1670.      $   CALL WCOPY(N-1,STKR(LE+1),STKI(LE+1),1,STKR(LL),STKI(LL),N+1)          
  1671.       LL = L2+N        
  1672.       IF (HESS .AND. HERM)                
  1673.      $   CALL WCOPY(N-1,STKR(LE+1),STKI(LE+1),1,STKR(LL),STKI(LL),N+1)          
  1674.       IF (FIN .LT. 10) GO TO 42           
  1675.       IF (VECT .OR. .NOT.(SCHUR.OR.HESS)) GO TO 99           
  1676.       CALL WCOPY(NN,STKR(L2),STKI(L2),1,STKR(L),STKI(L),1)   
  1677.       GO TO 99         
  1678. C                      
  1679. C     VECTOR OF EIGENVALUES               
  1680.    37 IF (FIN .EQ. 14) GO TO 52           
  1681.       CALL WCOPY(N,STKR(LD),STKI(LD),1,STKR(L),STKI(L),1)    
  1682.       NSTK(TOP) = 1    
  1683.       GO TO 99         
  1684. C                      
  1685. C     ELEMENTARY FUNCTIONS                
  1686. C     FOR MATRICES.. X,D = EIG(A), FUN(A) = X*FUN(D)/X       
  1687.    40 INC = 1          
  1688.       N = M*N          
  1689.       L2 = L           
  1690.       GO TO 44         
  1691.    42 INC = N+1        
  1692.    44 DO 46 J = 1, N   
  1693.         LS = L2+(J-1)*INC                 
  1694.         SR = STKR(LS)                     
  1695.         SI = STKI(LS)                     
  1696.         TI = 0.0D0     
  1697.         IF (FIN .NE. 0) GO TO 45          
  1698.           CALL WLOG(SR,SI,SR,SI)          
  1699.           CALL WMUL(SR,SI,POWR,POWI,SR,SI)                   
  1700.           TR = DEXP(SR)*DCOS(SI)          
  1701.           TI = DEXP(SR)*DSIN(SI)          
  1702.    45   IF (FIN .EQ. 1) TR = DSIN(SR)*DCOSH(SI)              
  1703.         IF (FIN .EQ. 1) TI = DCOS(SR)*DSINH(SI)              
  1704.         IF (FIN .EQ. 2) TR = DCOS(SR)*DCOSH(SI)              
  1705.         IF (FIN .EQ. 2) TI = -DSIN(SR)*DSINH(SI)             
  1706.         IF (FIN .EQ. 3) CALL WATAN(SR,SI,TR,TI)              
  1707.         IF (FIN .EQ. 4) TR = DEXP(SR)*DCOS(SI)               
  1708.         IF (FIN .EQ. 4) TI = DEXP(SR)*DSIN(SI)               
  1709.         IF (FIN .EQ. 5) CALL WSQRT(SR,SI,TR,TI)              
  1710.         IF (FIN .EQ. 6) CALL WLOG(SR,SI,TR,TI)               
  1711.         IF (FIN .EQ. 21) TR = PYTHAG(SR,SI)                  
  1712.         IF (FIN .EQ. 22) TR = ROUND(SR)   
  1713.         IF (FIN .EQ. 23) TR = SR          
  1714.         IF (FIN .EQ. 24) TR = SI          
  1715.         IF (FIN .EQ. 25) TR = SR          
  1716.         IF (FIN .EQ. 25) TI = -SI         
  1717.         IF (ERR .GT. 0) RETURN            
  1718.         STKR(LS) = FLOP(TR)               
  1719.         STKI(LS) = 0.0D0                  
  1720.         IF (TI .NE. 0.0D0) STKI(LS) = FLOP(TI)               
  1721.    46 CONTINUE         
  1722.       IF (INC .EQ. 1) GO TO 99            
  1723.       DO 48 J = 1, N   
  1724.         LS = L2+(J-1)*INC                 
  1725.         SR = STKR(LS)                     
  1726.         SI = STKI(LS)                     
  1727.         LS = L+(J-1)*N                    
  1728.         LL = L2+(J-1)*N                   
  1729.         CALL WCOPY(N,STKR(LS),STKI(LS),1,STKR(LL),STKI(LL),1)                   
  1730.         CALL WSCAL(N,SR,SI,STKR(LS),STKI(LS),1)              
  1731.    48 CONTINUE         
  1732. C     SIGNAL MATFN1 TO DIVIDE BY EIGENVECTORS                
  1733.       FUN = 21         
  1734.       FIN = -1         
  1735.       TOP = TOP-1      
  1736.       GO TO 99         
  1737. C                      
  1738. C     POLY             
  1739. C     FORM POLYNOMIAL WITH GIVEN VECTOR AS ROOTS             
  1740.    50 N = MAX0(M,N)    
  1741.       LD = L+N+1       
  1742.       CALL WCOPY(N,STKR(L),STKI(L),1,STKR(LD),STKI(LD),1)    
  1743. C                      
  1744. C     FORM CHARACTERISTIC POLYNOMIAL      
  1745.    52 CALL WSET(N+1,0.0D0,0.0D0,STKR(L),STKI(L),1)           
  1746.       STKR(L) = 1.0D0                     
  1747.       DO 56 J = 1, N   
  1748.          CALL WAXPY(J,-STKR(LD),-STKI(LD),STKR(L),STKI(L),-1,                   
  1749.      $              STKR(L+1),STKI(L+1),-1)                  
  1750.          LD = LD+1     
  1751.    56 CONTINUE         
  1752.       MSTK(TOP) = N+1                     
  1753.       NSTK(TOP) = 1    
  1754.       GO TO 99         
  1755. C                      
  1756. C     ROOTS            
  1757.    60 LL = L+M*N       
  1758.       STKR(LL) = -1.0D0                   
  1759.       STKI(LL) = 0.0D0                    
  1760.       K = -1           
  1761.    61 K = K+1          
  1762.       L1 = L+K         
  1763.       IF (DABS(STKR(L1))+DABS(STKI(L1)) .EQ. 0.0D0) GO TO 61 
  1764.       N = MAX0(M*N - K-1, 0)              
  1765.       IF (N .LE. 0) GO TO 65              
  1766.       L2 = L1+N+1      
  1767.       LW = L2+N*N      
  1768.       ERR = LW+N - LSTK(BOT)              
  1769.       IF (ERR .GT. 0) CALL ERROR(17)      
  1770.       IF (ERR .GT. 0) RETURN              
  1771.       CALL WSET(N*N+N,0.0D0,0.0D0,STKR(L2),STKI(L2),1)       
  1772.       DO 64 J = 1, N   
  1773.          LL = L2+J+(J-1)*N                
  1774.          STKR(LL) = 1.0D0                 
  1775.          LS = L1+J     
  1776.          LL = L2+(J-1)*N                  
  1777.          CALL WDIV(-STKR(LS),-STKI(LS),STKR(L1),STKI(L1),    
  1778.      $             STKR(LL),STKI(LL))     
  1779.          IF (ERR .GT. 0) RETURN           
  1780.    64 CONTINUE         
  1781.       CALL COMQR3(N,N,1,N,STKR(LW),STKI(LW),STKR(L2),STKI(L2),                  
  1782.      $            STKR(L),STKI(L),TR,TI,ERR,0)               
  1783.       IF (ERR .GT. 0) CALL ERROR(24)      
  1784.       IF (ERR .GT. 0) RETURN              
  1785.    65 MSTK(TOP) = N    
  1786.       NSTK(TOP) = 1    
  1787.       GO TO 99         
  1788.    99 RETURN           
  1789.       END
  1790.               
  1791.       SUBROUTINE MATFN3                   
  1792. C                      
  1793. C     EVALUATE FUNCTIONS INVOLVING SINGULAR VALUE DECOMPOSITION                 
  1794. C                      
  1795.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  1796.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  1797.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  1798.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  1799.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  1800.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  1801.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  1802.       LOGICAL FRO,INF                     
  1803.       DOUBLE PRECISION P,S,T,TOL,EPS      
  1804.       DOUBLE PRECISION WDOTCR,WDOTCI,PYTHAG,WNRM2,WASUM,FLOP 
  1805. C                      
  1806.       IF (DDT .EQ. 1) WRITE(WTE,100) FIN  
  1807.   100 FORMAT(1X,'MATFN3',I4)              
  1808. C                      
  1809.       IF (FIN.EQ.1 .AND. RHS.EQ.2) TOP = TOP-1               
  1810.       L = LSTK(TOP)    
  1811.       M = MSTK(TOP)    
  1812.       N = NSTK(TOP)    
  1813.       MN = M*N         
  1814.       GO TO (50,70,10,30,70), FIN         
  1815. C                      
  1816. C     COND             
  1817. C                      
  1818.    10 LD = L + M*N     
  1819.       L1 = LD + MIN0(M+1,N)               
  1820.       L2 = L1 + N      
  1821.       ERR = L2+MIN0(M,N) - LSTK(BOT)      
  1822.       IF (ERR .GT. 0) CALL ERROR(17)      
  1823.       IF (ERR .GT. 0) RETURN              
  1824.       CALL WSVDC(STKR(L),STKI(L),M,M,N,STKR(LD),STKI(LD),    
  1825.      $           STKR(L1),STKI(L1),T,T,1,T,T,1,STKR(L2),STKI(L2),               
  1826.      $           0,ERR)                   
  1827.       IF (ERR .NE. 0) CALL ERROR(24)      
  1828.       IF (ERR .GT. 0) RETURN              
  1829.       S = STKR(LD)     
  1830.       LD = LD + MIN0(M,N) - 1             
  1831.       T = STKR(LD)     
  1832.       IF (T .EQ. 0.0D0) GO TO 13          
  1833.       STKR(L) = FLOP(S/T)                 
  1834.       STKI(L) = 0.0D0                     
  1835.       MSTK(TOP) = 1    
  1836.       NSTK(TOP) = 1    
  1837.       GO TO 99         
  1838.    13 WRITE(WTE,14)    
  1839.       IF (WIO .NE. 0) WRITE(WIO,14)       
  1840.    14 FORMAT(1X,'CONDITION IS INFINITE')  
  1841.       MSTK(TOP) = 0    
  1842.       GO TO 99         
  1843. C                      
  1844. C     NORM             
  1845. C                      
  1846.    30 P = 2.0D0        
  1847.       INF = .FALSE.    
  1848.       IF (RHS .NE. 2) GO TO 31            
  1849.       FRO = IDINT(STKR(L)).EQ.15 .AND. MN.GT.1               
  1850.       INF = IDINT(STKR(L)).EQ.18 .AND. MN.GT.1               
  1851.       IF (.NOT. FRO) P = STKR(L)          
  1852.       TOP = TOP-1      
  1853.       L = LSTK(TOP)    
  1854.       M = MSTK(TOP)    
  1855.       N = NSTK(TOP)    
  1856.       MN = M*N         
  1857.       IF (FRO) M = MN                     
  1858.       IF (FRO) N = 1   
  1859.    31 IF (M .GT. 1 .AND. N .GT. 1) GO TO 40                  
  1860.       IF (P .EQ. 1.0D0) GO TO 36          
  1861.       IF (P .EQ. 2.0D0) GO TO 38          
  1862.       I = IWAMAX(MN,STKR(L),STKI(L),1) + L - 1               
  1863.       S = DABS(STKR(I)) + DABS(STKI(I))   
  1864.       IF (INF .OR. S .EQ. 0.0D0) GO TO 49                    
  1865.       T = 0.0D0        
  1866.       DO 33 I = 1, MN                     
  1867.          LS = L+I-1    
  1868.          T = FLOP(T + (PYTHAG(STKR(LS),STKI(LS))/S)**P)      
  1869.    33 CONTINUE         
  1870.       IF (P .NE. 0.0D0) P = 1.0D0/P       
  1871.       S = FLOP(S*T**P)                    
  1872.       GO TO 49         
  1873.    36 S = WASUM(MN,STKR(L),STKI(L),1)     
  1874.       GO TO 49         
  1875.    38 S = WNRM2(MN,STKR(L),STKI(L),1)     
  1876.       GO TO 49         
  1877. C                      
  1878. C     MATRIX NORM      
  1879. C                      
  1880.    40 IF (INF) GO TO 43                   
  1881.       IF (P .EQ. 1.0D0) GO TO 46          
  1882.       IF (P .NE. 2.0D0) CALL ERROR(23)    
  1883.       IF (ERR .GT. 0) RETURN              
  1884.       LD = L + M*N     
  1885.       L1 = LD + MIN0(M+1,N)               
  1886.       L2 = L1 + N      
  1887.       ERR = L2+MIN0(M,N) - LSTK(BOT)      
  1888.       IF (ERR .GT. 0) CALL ERROR(17)      
  1889.       IF (ERR .GT. 0) RETURN              
  1890.       CALL WSVDC(STKR(L),STKI(L),M,M,N,STKR(LD),STKI(LD),    
  1891.      $           STKR(L1),STKI(L1),T,T,1,T,T,1,STKR(L2),STKI(L2),               
  1892.      $           0,ERR)                   
  1893.       IF (ERR .NE. 0) CALL ERROR(24)      
  1894.       IF (ERR .GT. 0) RETURN              
  1895.       S = STKR(LD)     
  1896.       GO TO 49         
  1897.    43 S = 0.0D0        
  1898.       DO 45 I = 1, M   
  1899.          LI = L+I-1    
  1900.          T = WASUM(N,STKR(LI),STKI(LI),M)                    
  1901.          S = DMAX1(S,T)                   
  1902.    45 CONTINUE         
  1903.       GO TO 49         
  1904.    46 S = 0.0D0        
  1905.       DO 48 J = 1, N   
  1906.          LJ = L+(J-1)*M                   
  1907.          T = WASUM(M,STKR(LJ),STKI(LJ),1)                    
  1908.          S = DMAX1(S,T)                   
  1909.    48 CONTINUE         
  1910.       GO TO 49         
  1911.    49 STKR(L) = S      
  1912.       STKI(L) = 0.0D0                     
  1913.       MSTK(TOP) = 1    
  1914.       NSTK(TOP) = 1    
  1915.       GO TO 99         
  1916. C                      
  1917. C     SVD              
  1918. C                      
  1919.    50 IF (LHS .NE. 3) GO TO 52            
  1920.       K = M            
  1921.       IF (RHS .EQ. 2) K = MIN0(M,N)       
  1922.       LU = L + M*N     
  1923.       LD = LU + M*K    
  1924.       LV = LD + K*N    
  1925.       L1 = LV + N*N    
  1926.       L2 = L1 + N      
  1927.       ERR = L2+MIN0(M,N) - LSTK(BOT)      
  1928.       IF (ERR .GT. 0) CALL ERROR(17)      
  1929.       IF (ERR .GT. 0) RETURN              
  1930.       JOB = 11         
  1931.       IF (RHS .EQ. 2) JOB = 21            
  1932.       CALL WSVDC(STKR(L),STKI(L),M,M,N,STKR(LD),STKI(LD),    
  1933.      $        STKR(L1),STKI(L1),STKR(LU),STKI(LU),M,STKR(LV),STKI(LV),          
  1934.      $        N,STKR(L2),STKI(L2),JOB,ERR)                   
  1935.       DO 51 JB = 1, N                     
  1936.       DO 51 I = 1, K   
  1937.         J = N+1-JB     
  1938.         LL = LD+I-1+(J-1)*K               
  1939.         IF (I.NE.J) STKR(LL) = 0.0D0      
  1940.         STKI(LL) = 0.0D0                  
  1941.         LS = LD+I-1    
  1942.         IF (I.EQ.J) STKR(LL) = STKR(LS)   
  1943.         LS = L1+I-1    
  1944.         IF (ERR.NE.0 .AND. I.EQ.J-1) STKR(LL) = STKR(LS)     
  1945.    51 CONTINUE         
  1946.       IF (ERR .NE. 0) CALL ERROR(24)      
  1947.       ERR = 0          
  1948.       CALL WCOPY(M*K+K*N+N*N,STKR(LU),STKI(LU),1,STKR(L),STKI(L),1)             
  1949.       MSTK(TOP) = M    
  1950.       NSTK(TOP) = K    
  1951.       IF (TOP+1 .GE. BOT) CALL ERROR(18)  
  1952.       IF (ERR .GT. 0) RETURN              
  1953.       TOP = TOP+1      
  1954.       LSTK(TOP) = L + M*K                 
  1955.       MSTK(TOP) = K    
  1956.       NSTK(TOP) = N    
  1957.       IF (TOP+1 .GE. BOT) CALL ERROR(18)  
  1958.       IF (ERR .GT. 0) RETURN              
  1959.       TOP = TOP+1      
  1960.       LSTK(TOP) = L + M*K + K*N           
  1961.       MSTK(TOP) = N    
  1962.       NSTK(TOP) = N    
  1963.       GO TO 99         
  1964. C                      
  1965.    52 LD = L + M*N     
  1966.       L1 = LD + MIN0(M+1,N)               
  1967.       L2 = L1 + N      
  1968.       ERR = L2+MIN0(M,N) - LSTK(BOT)      
  1969.       IF (ERR .GT. 0) CALL ERROR(17)      
  1970.       IF (ERR .GT. 0) RETURN              
  1971.       CALL WSVDC(STKR(L),STKI(L),M,M,N,STKR(LD),STKI(LD),    
  1972.      $           STKR(L1),STKI(L1),T,T,1,T,T,1,STKR(L2),STKI(L2),               
  1973.      $           0,ERR)                   
  1974.       IF (ERR .NE. 0) CALL ERROR(24)      
  1975.       IF (ERR .GT. 0) RETURN              
  1976.       K = MIN0(M,N)    
  1977.       CALL WCOPY(K,STKR(LD),STKI(LD),1,STKR(L),STKI(L),1)    
  1978.       MSTK(TOP) = K    
  1979.       NSTK(TOP) = 1    
  1980.       GO TO 99         
  1981. C                      
  1982. C     PINV AND RANK    
  1983. C                      
  1984.    70 TOL = -1.0D0     
  1985.       IF (RHS .NE. 2) GO TO 71            
  1986.       TOL = STKR(L)    
  1987.       TOP = TOP-1      
  1988.       L = LSTK(TOP)    
  1989.       M = MSTK(TOP)    
  1990.       N = NSTK(TOP)    
  1991.    71 LU = L + M*N     
  1992.       LD = LU + M*M    
  1993.       IF (FIN .EQ. 5) LD = L + M*N        
  1994.       LV = LD + M*N    
  1995.       L1 = LV + N*N    
  1996.       IF (FIN .EQ. 5) L1 = LD + N         
  1997.       L2 = L1 + N      
  1998.       ERR = L2+MIN0(M,N) - LSTK(BOT)      
  1999.       IF (ERR .GT. 0) CALL ERROR(17)      
  2000.       IF (ERR .GT. 0) RETURN              
  2001.       IF (FIN .EQ. 2) JOB = 11            
  2002.       IF (FIN .EQ. 5) JOB = 0             
  2003.       CALL WSVDC(STKR(L),STKI(L),M,M,N,STKR(LD),STKI(LD),    
  2004.      $        STKR(L1),STKI(L1),STKR(LU),STKI(LU),M,STKR(LV),STKI(LV),          
  2005.      $        N,STKR(L2),STKI(L2),JOB,ERR)                   
  2006.       IF (ERR .NE. 0) CALL ERROR(24)      
  2007.       IF (ERR .GT. 0) RETURN              
  2008.       EPS = STKR(VSIZE-4)                 
  2009.       IF (TOL .LT. 0.0D0) TOL = FLOP(DFLOAT(MAX0(M,N))*EPS*STKR(LD))            
  2010.       MN = MIN0(M,N)   
  2011.       K = 0            
  2012.       DO 72 J = 1, MN                     
  2013.         LS = LD+J-1    
  2014.         S = STKR(LS)   
  2015.         IF (S .LE. TOL) GO TO 73          
  2016.         K = J          
  2017.         LL = LV+(J-1)*N                   
  2018.         IF (FIN .EQ. 2) CALL WRSCAL(N,1.0D0/S,STKR(LL),STKI(LL),1)              
  2019.    72 CONTINUE         
  2020.    73 IF (FIN .EQ. 5) GO TO 78            
  2021.       DO 76 J = 1, M   
  2022.       DO 76 I = 1, N   
  2023.         LL = L+I-1+(J-1)*N                
  2024.         L1 = LV+I-1    
  2025.         L2 = LU+J-1    
  2026.         STKR(LL) = WDOTCR(K,STKR(L2),STKI(L2),M,STKR(L1),STKI(L1),N)            
  2027.         STKI(LL) = WDOTCI(K,STKR(L2),STKI(L2),M,STKR(L1),STKI(L1),N)            
  2028.    76 CONTINUE         
  2029.       MSTK(TOP) = N    
  2030.       NSTK(TOP) = M    
  2031.       GO TO 99         
  2032.    78 STKR(L) = DFLOAT(K)                 
  2033.       STKI(L) = 0.0D0                     
  2034.       MSTK(TOP) = 1    
  2035.       NSTK(TOP) = 1    
  2036.       GO TO 99         
  2037. C                      
  2038.    99 RETURN           
  2039.       END
  2040.               
  2041.       SUBROUTINE MATFN4                   
  2042. C                      
  2043. C     EVALUATE FUNCTIONS INVOLVING QR DECOMPOSITION (LEAST SQUARES)             
  2044. C                      
  2045.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  2046.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  2047.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  2048.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  2049.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  2050.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  2051.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  2052.       DOUBLE PRECISION T,TOL,EPS,FLOP     
  2053.       INTEGER QUOTE    
  2054.       DATA QUOTE/49/   
  2055. C                      
  2056.       IF (DDT .EQ. 1) WRITE(WTE,100) FIN  
  2057.   100 FORMAT(1X,'MATFN4',I4)              
  2058. C                      
  2059.       L = LSTK(TOP)    
  2060.       M = MSTK(TOP)    
  2061.       N = NSTK(TOP)    
  2062.       IF (FIN .EQ. -1) GO TO 10           
  2063.       IF (FIN .EQ. -2) GO TO 20           
  2064.       GO TO 40         
  2065. C                      
  2066. C     RECTANGULAR MATRIX RIGHT DIVISION, A/A2                
  2067.    10 L2 = LSTK(TOP+1)                    
  2068.       M2 = MSTK(TOP+1)                    
  2069.       N2 = NSTK(TOP+1)                    
  2070.       TOP = TOP + 1    
  2071.       IF (N.GT.1 .AND. N.NE.N2) CALL ERROR(11)               
  2072.       IF (ERR .GT. 0) RETURN              
  2073.       CALL STACK1(QUOTE)                  
  2074.       IF (ERR .GT. 0) RETURN              
  2075.       LL = L2+M2*N2    
  2076.       CALL WCOPY(M*N,STKR(L),STKI(L),1,STKR(LL),STKI(LL),1)  
  2077.       CALL WCOPY(M*N+M2*N2,STKR(L2),STKI(L2),1,STKR(L),STKI(L),1)               
  2078.       LSTK(TOP) = L+M2*N2                 
  2079.       MSTK(TOP) = M    
  2080.       NSTK(TOP) = N    
  2081.       CALL STACK1(QUOTE)                  
  2082.       IF (ERR .GT. 0) RETURN              
  2083.       TOP = TOP - 1    
  2084.       M = N2           
  2085.       N = M2           
  2086.       GO TO 20         
  2087. C                      
  2088. C     RECTANGULAR MATRIX LEFT DIVISION A BACKSLASH A2        
  2089. C                      
  2090.    20 L2 = LSTK(TOP+1)                    
  2091.       M2 = MSTK(TOP+1)                    
  2092.       N2 = NSTK(TOP+1)                    
  2093.       IF (M2*N2 .GT. 1) GO TO 21          
  2094.         M2 = M         
  2095.         N2 = M         
  2096.         ERR = L2+M*M - LSTK(BOT)          
  2097.         IF (ERR .GT. 0) CALL ERROR(17)    
  2098.         IF (ERR .GT. 0) RETURN            
  2099.         CALL WSET(M*M-1,0.0D0,0.0D0,STKR(L2+1),STKI(L2+1),1) 
  2100.         CALL WCOPY(M,STKR(L2),STKI(L2),0,STKR(L2),STKI(L2),M+1)                 
  2101.    21 IF (M2 .NE. M) CALL ERROR(12)       
  2102.       IF (ERR .GT. 0) RETURN              
  2103.       L3 = L2 + MAX0(M,N)*N2              
  2104.       L4 = L3 + N      
  2105.       ERR = L4 + N - LSTK(BOT)            
  2106.       IF (ERR .GT. 0) CALL ERROR(17)      
  2107.       IF (ERR .GT. 0) RETURN              
  2108.       IF (M .GT. N) GO TO 23              
  2109.       DO 22 JB = 1, N2                    
  2110.         J = N+1-JB     
  2111.         LS = L2 + (J-1)*M                 
  2112.         LL = L2 + (J-1)*N                 
  2113.         CALL WCOPY(M,STKR(LS),STKI(LS),-1,STKR(LL),STKI(LL),-1)                 
  2114.    22 CONTINUE         
  2115.    23 DO 24 J = 1, N   
  2116.         BUF(J) = 0     
  2117.    24 CONTINUE         
  2118.       CALL WQRDC(STKR(L),STKI(L),M,M,N,STKR(L4),STKI(L4),    
  2119.      $           BUF,STKR(L3),STKI(L3),1)                    
  2120.       K = 0            
  2121.       EPS = STKR(VSIZE-4)                 
  2122.       T = DABS(STKR(L))+DABS(STKI(L))     
  2123.       TOL = FLOP(DFLOAT(MAX0(M,N))*EPS*T)                    
  2124.       MN = MIN0(M,N)   
  2125.       DO 27 J = 1, MN                     
  2126.         LS = L+J-1+(J-1)*M                
  2127.         T = DABS(STKR(LS)) + DABS(STKI(LS))                  
  2128.         IF (T .GT. TOL) K = J             
  2129.    27 CONTINUE         
  2130.       IF (K .LT. MN) WRITE(WTE,28) K,TOL  
  2131.       IF (K.LT.MN .AND. WIO.NE.0) WRITE(WIO,28) K,TOL        
  2132.    28 FORMAT(1X,'RANK DEFICIENT,  RANK =',I4,',  TOL =',1PD13.4)                
  2133.       MN = MAX0(M,N)   
  2134.       DO 29 J = 1, N2                     
  2135.         LS = L2+(J-1)*MN                  
  2136.         CALL WQRSL(STKR(L),STKI(L),M,M,K,STKR(L4),STKI(L4),  
  2137.      $             STKR(LS),STKI(LS),T,T,STKR(LS),STKI(LS),  
  2138.      $             STKR(LS),STKI(LS),T,T,T,T,100,INFO)       
  2139.         LL = LS+K      
  2140.         CALL WSET(N-K,0.0D0,0.0D0,STKR(LL),STKI(LL),1)       
  2141.    29 CONTINUE         
  2142.       DO 31 J = 1, N   
  2143.         BUF(J) = -BUF(J)                  
  2144.    31 CONTINUE         
  2145.       DO 35 J = 1, N   
  2146.         IF (BUF(J) .GT. 0) GO TO 35       
  2147.         K = -BUF(J)    
  2148.         BUF(J) = K     
  2149.    33   CONTINUE       
  2150.           IF (K .EQ. J) GO TO 34          
  2151.           LS = L2+J-1                     
  2152.           LL = L2+K-1                     
  2153.           CALL WSWAP(N2,STKR(LS),STKI(LS),MN,STKR(LL),STKI(LL),MN)              
  2154.           BUF(K) = -BUF(K)                
  2155.           K = BUF(K)   
  2156.           GO TO 33     
  2157.    34   CONTINUE       
  2158.    35 CONTINUE         
  2159.       DO 36 J = 1, N2                     
  2160.         LS = L2+(J-1)*MN                  
  2161.         LL = L+(J-1)*N                    
  2162.         CALL WCOPY(N,STKR(LS),STKI(LS),1,STKR(LL),STKI(LL),1)                   
  2163.    36 CONTINUE         
  2164.       MSTK(TOP) = N    
  2165.       NSTK(TOP) = N2   
  2166.       IF (FIN .EQ. -1) CALL STACK1(QUOTE)                    
  2167.       IF (ERR .GT. 0) RETURN              
  2168.       GO TO 99         
  2169. C                      
  2170. C     QR               
  2171. C                      
  2172.    40 MM = MAX0(M,N)   
  2173.       LS = L + MM*MM   
  2174.       IF (LHS.EQ.1 .AND. FIN.EQ.1) LS = L                    
  2175.       LE = LS + M*N    
  2176.       L4 = LE + MM     
  2177.       ERR = L4+MM - LSTK(BOT)             
  2178.       IF (ERR .GT. 0) CALL ERROR(17)      
  2179.       IF (ERR .GT. 0) RETURN              
  2180.       IF (LS.NE.L) CALL WCOPY(M*N,STKR(L),STKI(L),1,STKR(LS),STKI(LS),1)        
  2181.       JOB = 1          
  2182.       IF (LHS.LT.3) JOB = 0               
  2183.       DO 42 J = 1, N   
  2184.         BUF(J) = 0     
  2185.    42 CONTINUE         
  2186.       CALL WQRDC(STKR(LS),STKI(LS),M,M,N,STKR(L4),STKI(L4),  
  2187.      $            BUF,STKR(LE),STKI(LE),JOB)                 
  2188.       IF (LHS.EQ.1 .AND. FIN.EQ.1) GO TO 99                  
  2189.       CALL WSET(M*M,0.0D0,0.0D0,STKR(L),STKI(L),1)           
  2190.       CALL WSET(M,1.0D0,0.0D0,STKR(L),STKI(L),M+1)           
  2191.       DO 43 J = 1, M   
  2192.         LL = L+(J-1)*M                    
  2193.         CALL WQRSL(STKR(LS),STKI(LS),M,M,N,STKR(L4),STKI(L4),                   
  2194.      $             STKR(LL),STKI(LL),STKR(LL),STKI(LL),T,T,  
  2195.      $             T,T,T,T,T,T,10000,INFO)                   
  2196.    43 CONTINUE         
  2197.       IF (FIN .EQ. 2) GO TO 99            
  2198.       NSTK(TOP) = M    
  2199.       DO 45 J = 1, N   
  2200.         LL = LS+J+(J-1)*M                 
  2201.         CALL WSET(M-J,0.0D0,0.0D0,STKR(LL),STKI(LL),1)       
  2202.    45 CONTINUE         
  2203.       IF (TOP+1 .GE. BOT) CALL ERROR(18)  
  2204.       IF (ERR .GT. 0) RETURN              
  2205.       TOP = TOP+1      
  2206.       LSTK(TOP) = LS   
  2207.       MSTK(TOP) = M    
  2208.       NSTK(TOP) = N    
  2209.       IF (LHS .EQ. 2) GO TO 99            
  2210.       CALL WSET(N*N,0.0D0,0.0D0,STKR(LE),STKI(LE),1)         
  2211.       DO 47 J = 1, N   
  2212.         LL = LE+BUF(J)-1+(J-1)*N          
  2213.         STKR(LL) = 1.0D0                  
  2214.    47 CONTINUE         
  2215.       IF (TOP+1 .GE. BOT) CALL ERROR(18)  
  2216.       IF (ERR .GT. 0) RETURN              
  2217.       TOP = TOP+1      
  2218.       LSTK(TOP) = LE   
  2219.       MSTK(TOP) = N    
  2220.       NSTK(TOP) = N    
  2221.       GO TO 99         
  2222. C                      
  2223.    99 RETURN           
  2224.       END              
  2225.       SUBROUTINE MATFN5                   
  2226. C                      
  2227. C     FILE HANDLING AND OTHER I/O         
  2228. C                      
  2229.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  2230.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  2231.       INTEGER ALFA(52),ALFB(52),ALFL,CASE                    
  2232.       INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ       
  2233.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  2234.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  2235.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  2236.       COMMON /ALFS/ ALFA,ALFB,ALFL,CASE   
  2237.       COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ               
  2238.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  2239.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  2240.       INTEGER EOL,CH,BLANK,FLAG,TOP2,PLUS,MINUS,QUOTE,SEMI,LRAT,MRAT            
  2241.       INTEGER ID(4)    
  2242.       DOUBLE PRECISION EPS,B,S,T,FLOP,WASUM                  
  2243.       LOGICAL TEXT     
  2244.       DATA EOL/99/,BLANK/36/,PLUS/41/,MINUS/42/,QUOTE/49/,SEMI/39/              
  2245.       DATA LRAT/5/,MRAT/100/              
  2246. C                      
  2247.       IF (DDT .EQ. 1) WRITE(WTE,100) FIN  
  2248.   100 FORMAT(1X,'MATFN5',I4)              
  2249. C     FUNCTIONS/FIN    
  2250. C     EXEC SAVE LOAD PRIN DIAR DISP BASE LINE CHAR PLOT RAT  DEBU               
  2251. C      1    2    3    4    5    6    7    8    9   10   11   12                 
  2252.       L = LSTK(TOP)    
  2253.       M = MSTK(TOP)    
  2254.       N = NSTK(TOP)    
  2255.       IF (FIN .GT. 5) GO TO 15            
  2256. C                      
  2257. C     CONVERT FILE NAME                   
  2258.       MN = M*N         
  2259.       FLAG = 3         
  2260.       IF (SYM .EQ. SEMI) FLAG = 0         
  2261.       IF (RHS .LT. 2) GO TO 12            
  2262.          FLAG = IDINT(STKR(L))            
  2263.          TOP2 = TOP    
  2264.          TOP = TOP-1   
  2265.          L = LSTK(TOP)                    
  2266.          MN = MSTK(TOP)*NSTK(TOP)         
  2267.    12 LUN = -1         
  2268.       IF (MN.EQ.1 .AND. STKR(L).LT.10.0D0) LUN = IDINT(STKR(L))                 
  2269.       IF (LUN .GE. 0) GO TO 15            
  2270.       DO 14 J = 1, 32                     
  2271.          LS = L+J-1    
  2272.          IF (J .LE. MN) CH = IDINT(STKR(LS))                 
  2273.          IF (J .GT. MN) CH = BLANK        
  2274.          IF (CH.LT.0 .OR. CH.GE.ALFL) CALL ERROR(38)         
  2275.          IF (ERR .GT. 0) RETURN           
  2276.          IF (CASE .EQ. 0) BUF(J) = ALFA(CH+1)                
  2277.          IF (CASE .EQ. 1) BUF(J) = ALFB(CH+1)                
  2278.    14 CONTINUE         
  2279. C                      
  2280.    15 GO TO (20,30,35,25,27,60,65,70,50,80,40,95),FIN        
  2281. C                      
  2282. C     EXEC             
  2283.    20 IF (LUN .EQ. 0) GO TO 23            
  2284.       K = LPT(6)       
  2285.       LIN(K+1) = LPT(1)                   
  2286.       LIN(K+2) = LPT(3)                   
  2287.       LIN(K+3) = LPT(6)                   
  2288.       LIN(K+4) = PTZ   
  2289.       LIN(K+5) = RIO   
  2290.       LIN(K+6) = LCT(4)                   
  2291.       LPT(1) = K + 7   
  2292.       LCT(4) = FLAG    
  2293.       PTZ = PT - 4     
  2294.       IF (RIO .EQ. RTE) RIO = 12          
  2295.       RIO = RIO + 1    
  2296.       IF (LUN .GT. 0) RIO = LUN           
  2297.       IF (LUN .LT. 0) CALL FILES(RIO,BUF)                    
  2298.       IF (FLAG .GE. 4) WRITE(WTE,22)      
  2299.    22 FORMAT(1X,'PAUSE MODE. ENTER BLANK LINES.')            
  2300.       SYM = EOL        
  2301.       MSTK(TOP) = 0    
  2302.       GO TO 99         
  2303. C                      
  2304. C     EXEC(0)          
  2305.    23 RIO = RTE        
  2306.       ERR = 99         
  2307.       GO TO 99         
  2308. C                      
  2309. C     PRINT            
  2310.    25 K = WTE          
  2311.       WTE = LUN        
  2312.       IF (LUN .LT. 0) WTE = 7             
  2313.       IF (LUN .LT. 0) CALL FILES(WTE,BUF)                    
  2314.       L = LCT(2)       
  2315.       LCT(2) = 9999    
  2316.       IF (RHS .GT. 1) CALL PRINT(SYN,TOP2)                   
  2317.       LCT(2) = L       
  2318.       WTE = K          
  2319.       MSTK(TOP) = 0    
  2320.       GO TO 99         
  2321. C                      
  2322. C     DIARY            
  2323.    27 WIO = LUN        
  2324.       IF (LUN .LT. 0) WIO = 8             
  2325.       IF (LUN .LT. 0) CALL FILES(WIO,BUF)                    
  2326.       MSTK(TOP) = 0    
  2327.       GO TO 99         
  2328. C                      
  2329. C     SAVE             
  2330.    30 IF (LUN .LT. 0) LUNIT = 1           
  2331.       IF (LUN .LT. 0) CALL FILES(LUNIT,BUF)                  
  2332.       IF (LUN .GT. 0) LUNIT = LUN         
  2333.       K = LSIZE-4      
  2334.       IF (K .LT. BOT) K = LSIZE           
  2335.       IF (RHS .EQ. 2) K = TOP2            
  2336.       IF (RHS .EQ. 2) CALL PUTID(IDSTK(1,K),SYN)             
  2337.    32 L = LSTK(K)      
  2338.       M = MSTK(K)      
  2339.       N = NSTK(K)      
  2340.       DO 34 I = 1, 4   
  2341.          J = IDSTK(I,K)+1                 
  2342.          BUF(I) = ALFA(J)                 
  2343.    34 CONTINUE         
  2344.       IMG = 0          
  2345.       IF (WASUM(M*N,STKI(L),STKI(L),1) .NE. 0.0D0) IMG = 1   
  2346.       IF(FE .EQ. 0)CALL SAVLOD(LUNIT,BUF,M,N,IMG,0,STKR(L),STKI(L))       
  2347.       K = K-1          
  2348.       IF (K .GE. BOT) GO TO 32            
  2349.       CALL FILES(-LUNIT,BUF)              
  2350.       MSTK(TOP) = 0    
  2351.       GO TO 99         
  2352. C                      
  2353. C     LOAD             
  2354.    35 IF (LUN .LT. 0) LUNIT = 2           
  2355.       IF (LUN .LT. 0) CALL FILES(LUNIT,BUF)                  
  2356.       IF (LUN .GT. 0) LUNIT = LUN         
  2357.    36 JOB = LSTK(BOT) - L                 
  2358.       IF(FE .EQ. 0)
  2359.      +CALL SAVLOD(LUNIT,ID,MSTK(TOP),NSTK(TOP),IMG,JOB,STKR(L),STKI(L))         
  2360.       MN = MSTK(TOP)*NSTK(TOP)            
  2361.       IF (MN .EQ. 0) GO TO 39             
  2362.       IF (IMG .EQ. 0) CALL RSET(MN,0.0D0,STKI(L),1)          
  2363.       DO 38 I = 1, 4   
  2364.          J = 0         
  2365.    37    J = J+1       
  2366.          IF (ID(I).NE.ALFA(J) .AND. J.LE.BLANK) GO TO 37     
  2367.          ID(I) = J-1   
  2368.    38 CONTINUE         
  2369.       SYM = SEMI       
  2370.       RHS = 0          
  2371.       CALL STACKP(ID)                     
  2372.       TOP = TOP + 1    
  2373.       GO TO 36         
  2374.    39 CALL FILES(-LUNIT,BUF)              
  2375.       MSTK(TOP) = 0    
  2376.       GO TO 99         
  2377. C                      
  2378. C     RAT              
  2379.    40 IF (RHS .EQ. 2) GO TO 44            
  2380.       MN = M*N         
  2381.       L2 = L           
  2382.       IF (LHS .EQ. 2) L2 = L + MN         
  2383.       LW = L2 + MN     
  2384.       ERR = LW + LRAT - LSTK(BOT)         
  2385.       IF (ERR .GT. 0) CALL ERROR(17)      
  2386.       IF (ERR .GT. 0) RETURN              
  2387.       IF (LHS .EQ. 2) TOP = TOP + 1       
  2388.       LSTK(TOP) = L2   
  2389.       MSTK(TOP) = M    
  2390.       NSTK(TOP) = N    
  2391.       CALL RSET(LHS*MN,0.0D0,STKI(L),1)   
  2392.       DO 42 I = 1, MN                     
  2393.          CALL RAT(STKR(L),LRAT,MRAT,S,T,STKR(LW))            
  2394.          STKR(L) = S   
  2395.          STKR(L2) = T                     
  2396.          IF (LHS .EQ. 1) STKR(L) = FLOP(S/T)                 
  2397.          L = L + 1     
  2398.          L2 = L2 + 1   
  2399.    42 CONTINUE         
  2400.       GO TO 99         
  2401.    44 MRAT = IDINT(STKR(L))               
  2402.       LRAT = IDINT(STKR(L-1))             
  2403.       TOP = TOP - 1    
  2404.       MSTK(TOP) = 0    
  2405.       GO TO 99         
  2406. C                      
  2407. C     CHAR             
  2408.    50 K = IABS(IDINT(STKR(L)))            
  2409.       IF (M*N.NE.1 .OR. K.GE.ALFL) CALL ERROR(36)            
  2410.       IF (ERR .GT. 0) RETURN              
  2411.       CH = ALFA(K+1)   
  2412.       IF (STKR(L) .LT. 0.0D0) CH = ALFB(K+1)                 
  2413.       WRITE(WTE,51) CH                    
  2414.    51 FORMAT(1X,'REPLACE CHARACTER ',A1)  
  2415.       READ(RTE,52) CH                     
  2416.    52 FORMAT(A1)       
  2417.       IF (STKR(L) .GE. 0.0D0) ALFA(K+1) = CH                 
  2418.       IF (STKR(L) .LT. 0.0D0) ALFB(K+1) = CH                 
  2419.       MSTK(TOP) = 0    
  2420.       GO TO 99         
  2421. C                      
  2422. C     DISP             
  2423.    60 WRITE(WTE,61)    
  2424.       IF (WIO .NE. 0) WRITE(WIO,61)       
  2425.    61 FORMAT(1X,80A1)                     
  2426.       IF (RHS .EQ. 2) GO TO 65            
  2427.       MN = M*N         
  2428.       TEXT = .TRUE.    
  2429.       DO 62 I = 1, MN                     
  2430.         LS = L+I-1     
  2431.         CH = IDINT(STKR(LS))              
  2432.         TEXT = TEXT .AND. (CH.GE.0) .AND. (CH.LT.ALFL)       
  2433.         TEXT = TEXT .AND. (DFLOAT(CH).EQ.STKR(LS))           
  2434.    62 CONTINUE         
  2435.       DO 64 I = 1, M   
  2436.       DO 63 J = 1, N   
  2437.         LS = L+I-1+(J-1)*M                
  2438.         IF (STKR(LS) .EQ. 0.0D0) CH = BLANK                  
  2439.         IF (STKR(LS) .GT. 0.0D0) CH = PLUS                   
  2440.         IF (STKR(LS) .LT. 0.0D0) CH = MINUS                  
  2441.         IF (TEXT) CH = IDINT(STKR(LS))    
  2442.         BUF(J) = ALFA(CH+1)               
  2443.    63 CONTINUE         
  2444.       WRITE(WTE,61) (BUF(J),J=1,N)        
  2445.       IF (WIO .NE. 0) WRITE(WIO,61) (BUF(J),J=1,N)           
  2446.    64 CONTINUE         
  2447.       MSTK(TOP) = 0    
  2448.       GO TO 99         
  2449. C                      
  2450. C     BASE             
  2451.    65 IF (RHS .NE. 2) CALL ERROR(39)      
  2452.       IF (STKR(L) .LE. 1.0D0) CALL ERROR(36)                 
  2453.       IF (ERR .GT. 0) RETURN              
  2454.       B = STKR(L)      
  2455.       L2 = L           
  2456.       TOP = TOP-1      
  2457.       RHS = 1          
  2458.       L = LSTK(TOP)    
  2459.       M = MSTK(TOP)*NSTK(TOP)             
  2460.       EPS = STKR(VSIZE-4)                 
  2461.       DO 66 I = 1, M   
  2462.          LS = L2+(I-1)*N                  
  2463.          LL = L+I-1    
  2464.          CALL BASE(STKR(LL),B,EPS,STKR(LS),N)                
  2465.    66 CONTINUE         
  2466.       CALL RSET(M*N,0.0D0,STKI(L2),1)     
  2467.       CALL WCOPY(M*N,STKR(L2),STKI(L2),1,STKR(L),STKI(L),1)  
  2468.       MSTK(TOP) = N    
  2469.       NSTK(TOP) = M    
  2470.       CALL STACK1(QUOTE)                  
  2471.       IF (FIN .EQ. 6) GO TO 60            
  2472.       GO TO 99         
  2473. C                      
  2474. C     LINES            
  2475.    70 LCT(2) = IDINT(STKR(L))             
  2476.       MSTK(TOP) = 0    
  2477.       GO TO 99         
  2478. C                      
  2479. C     PLOT             
  2480.    80 IF (RHS .GE. 2) GO TO 82            
  2481.       N = M*N          
  2482.       DO 81 I = 1, N   
  2483.          LL = L+I-1    
  2484.          STKI(LL) = DFLOAT(I)             
  2485.    81 CONTINUE         
  2486.       CALL PLOT(WTE,STKI(L),STKR(L),N,T,0,BUF)               
  2487.       IF (WIO .NE. 0) CALL PLOT(WIO,STKI(L),STKR(L),N,T,0,BUF)                  
  2488.       MSTK(TOP) = 0    
  2489.       GO TO 99         
  2490.    82 IF (RHS .EQ. 2) K = 0               
  2491.       IF (RHS .EQ. 3) K = M*N             
  2492.       IF (RHS .GT. 3) K = RHS - 2         
  2493.       TOP = TOP - (RHS - 1)               
  2494.       N = MSTK(TOP)*NSTK(TOP)             
  2495.       IF (MSTK(TOP+1)*NSTK(TOP+1) .NE. N) CALL ERROR(5)      
  2496.       IF (ERR .GT. 0) RETURN              
  2497.       LX = LSTK(TOP)   
  2498.       LY = LSTK(TOP+1)                    
  2499.       IF (RHS .GT. 3) L = LSTK(TOP+2)     
  2500.       CALL PLOT(WTE,STKR(LX),STKR(LY),N,STKR(L),K,BUF)       
  2501.       IF (WIO .NE. 0) CALL PLOT(WIO,STKR(LX),STKR(LY),N,STKR(L),K,BUF)          
  2502.       MSTK(TOP) = 0    
  2503.       GO TO 99         
  2504. C                      
  2505. C     DEBUG            
  2506.    95 DDT = IDINT(STKR(L))                
  2507.       WRITE(WTE,96) DDT                   
  2508.    96 FORMAT(1X,'DEBUG ',I4)              
  2509.       MSTK(TOP) = 0    
  2510.       GO TO 99         
  2511. C                      
  2512.    99 RETURN           
  2513.       END
  2514.               
  2515.       SUBROUTINE MATFN6                   
  2516. C                      
  2517. C     EVALUATE UTILITY FUNCTIONS          
  2518. C                      
  2519.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  2520.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  2521.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  2522.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  2523.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  2524.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  2525.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  2526.       INTEGER SEMI,ID(4),UNIFOR(4),NORMAL(4),SEED(4)         
  2527.       DOUBLE PRECISION EPS0,EPS,S,SR,SI,T                    
  2528.       DOUBLE PRECISION FLOP,URAND         
  2529.       LOGICAL EQID     
  2530.       DATA SEMI/39/    
  2531.       DATA UNIFOR/30,23,18,15/,NORMAL/23,24,27,22/,SEED/28,14,14,13/            
  2532. C                      
  2533.       IF (DDT .EQ. 1) WRITE(WTE,100) FIN  
  2534.   100 FORMAT(1X,'MATFN6',I4)              
  2535. C     FUNCTIONS/FIN    
  2536. C     MAGI DIAG SUM  PROD USER EYE  RAND ONES CHOP SIZE KRON  TRIL TRIU         
  2537. C       1    2    3    4    5    6    7    8    9   10  11-13  14   15          
  2538.       L = LSTK(TOP)    
  2539.       M = MSTK(TOP)    
  2540.       N = NSTK(TOP)    
  2541.       GO TO (75,80,65,67,70,90,90,90,60,77,50,50,50,80,80),FIN                  
  2542. C                      
  2543. C     KRONECKER PRODUCT                   
  2544.    50 IF (RHS .NE. 2) CALL ERROR(39)      
  2545.       IF (ERR .GT. 0) RETURN              
  2546.       TOP = TOP - 1    
  2547.       L = LSTK(TOP)    
  2548.       MA = MSTK(TOP)   
  2549.       NA = NSTK(TOP)   
  2550.       LA = L + MAX0(M*N*MA*NA,M*N+MA*NA)  
  2551.       LB = LA + MA*NA                     
  2552.       ERR = LB + M*N - LSTK(BOT)          
  2553.       IF (ERR .GT. 0) CALL ERROR(17)      
  2554.       IF (ERR .GT. 0) RETURN              
  2555. C     MOVE A AND B ABOVE RESULT           
  2556.       CALL WCOPY(MA*NA+M*N,STKR(L),STKI(L),1,STKR(LA),STKI(LA),1)               
  2557.       DO 54 JA = 1, NA                    
  2558.         DO 53 J = 1, N                    
  2559.           LJ = LB + (J-1)*M               
  2560.           DO 52 IA = 1, MA                
  2561. C           GET J-TH COLUMN OF B          
  2562.             CALL WCOPY(M,STKR(LJ),STKI(LJ),1,STKR(L),STKI(L),1)                 
  2563. C           ADDRESS OF A(IA,JA)           
  2564.             LS = LA + IA-1 + (JA-1)*MA    
  2565.             DO 51 I = 1, M                
  2566. C             A(IA,JA) OP B(I,J)          
  2567.               IF (FIN .EQ. 11) CALL WMUL(STKR(LS),STKI(LS),  
  2568.      $           STKR(L),STKI(L),STKR(L),STKI(L))            
  2569.               IF (FIN .EQ. 12) CALL WDIV(STKR(LS),STKI(LS),  
  2570.      $           STKR(L),STKI(L),STKR(L),STKI(L))            
  2571.               IF (FIN .EQ. 13) CALL WDIV(STKR(L),STKI(L),    
  2572.      $           STKR(LS),STKI(LS),STKR(L),STKI(L))          
  2573.               IF (ERR .GT. 0) RETURN      
  2574.               L = L + 1                   
  2575.    51       CONTINUE   
  2576.    52     CONTINUE     
  2577.    53   CONTINUE       
  2578.    54 CONTINUE         
  2579.       MSTK(TOP) = M*MA                    
  2580.       NSTK(TOP) = N*NA                    
  2581.       GO TO 99         
  2582. C                      
  2583. C     CHOP             
  2584.    60 EPS0 = 1.0D0     
  2585.    61 EPS0 = EPS0/2.0D0                   
  2586.       T = FLOP(1.0D0 + EPS0)              
  2587.       IF (T .GT. 1.0D0) GO TO 61          
  2588.       EPS0 = 2.0D0*EPS0                   
  2589.       FLP(2) = IDINT(STKR(L))             
  2590.       IF (SYM .NE. SEMI) WRITE(WTE,62) FLP(2)                
  2591.    62 FORMAT(/1X,'CHOP ',I2,' PLACES.')   
  2592.       EPS = 1.0D0      
  2593.    63 EPS = EPS/2.0D0                     
  2594.       T = FLOP(1.0D0 + EPS)               
  2595.       IF (T .GT. 1.0D0) GO TO 63          
  2596.       EPS = 2.0D0*EPS                     
  2597.       T = STKR(VSIZE-4)                   
  2598.       IF (T.LT.EPS .OR. T.EQ.EPS0) STKR(VSIZE-4) = EPS       
  2599.       MSTK(TOP) = 0    
  2600.       GO TO 99         
  2601. C                      
  2602. C     SUM              
  2603.    65 SR = 0.0D0       
  2604.       SI = 0.0D0       
  2605.       MN = M*N         
  2606.       DO 66 I = 1, MN                     
  2607.          LS = L+I-1    
  2608.          SR = FLOP(SR+STKR(LS))           
  2609.          SI = FLOP(SI+STKI(LS))           
  2610.    66 CONTINUE         
  2611.       GO TO 69         
  2612. C                      
  2613. C     PROD             
  2614.    67 SR = 1.0D0       
  2615.       SI = 0.0D0       
  2616.       MN = M*N         
  2617.       DO 68 I = 1, MN                     
  2618.          LS = L+I-1    
  2619.          CALL WMUL(STKR(LS),STKI(LS),SR,SI,SR,SI)            
  2620.    68 CONTINUE         
  2621.    69 STKR(L) = SR     
  2622.       STKI(L) = SI     
  2623.       MSTK(TOP) = 1    
  2624.       NSTK(TOP) = 1    
  2625.       GO TO 99         
  2626. C                      
  2627. C     USER             
  2628.    70 S = 0.0D0        
  2629.       T = 0.0D0        
  2630.       IF (RHS .LT. 2) GO TO 72            
  2631.       IF (RHS .LT. 3) GO TO 71            
  2632.       T = STKR(L)      
  2633.       TOP = TOP-1      
  2634.       L = LSTK(TOP)    
  2635.       M = MSTK(TOP)    
  2636.       N = NSTK(TOP)    
  2637.    71 S = STKR(L)      
  2638.       TOP = TOP-1      
  2639.       L = LSTK(TOP)    
  2640.       M = MSTK(TOP)    
  2641.       N = NSTK(TOP)    
  2642.    72 CALL USER(STKR(L),M,N,S,T)          
  2643.       CALL RSET(M*N,0.0D0,STKI(L),1)      
  2644.       MSTK(TOP) = M    
  2645.       NSTK(TOP) = N    
  2646.       GO TO 99         
  2647. C                      
  2648. C     MAGIC            
  2649.    75 N = MAX0(IDINT(STKR(L)),0)          
  2650.       IF (N .EQ. 2) N = 0                 
  2651.       IF (N .GT. 0) CALL MAGIC(STKR(L),N,N)                  
  2652.       CALL RSET(N*N,0.0D0,STKI(L),1)      
  2653.       MSTK(TOP) = N    
  2654.       NSTK(TOP) = N    
  2655.       GO TO 99         
  2656. C                      
  2657. C     SIZE             
  2658.    77 STKR(L) = M      
  2659.       STKR(L+1) = N    
  2660.       STKI(L) = 0.0D0                     
  2661.       STKI(L+1) = 0.0D0                   
  2662.       MSTK(TOP) = 1    
  2663.       NSTK(TOP) = 2    
  2664.       IF (LHS .EQ. 1) GO TO 99            
  2665.       NSTK(TOP) = 1    
  2666.       TOP = TOP + 1    
  2667.       LSTK(TOP) = L+1                     
  2668.       MSTK(TOP) = 1    
  2669.       NSTK(TOP) = 1    
  2670.       GO TO 99         
  2671. C                      
  2672. C     DIAG, TRIU, TRIL                    
  2673.    80 K = 0            
  2674.       IF (RHS .NE. 2) GO TO 81            
  2675.          K = IDINT(STKR(L))               
  2676.          TOP = TOP-1   
  2677.          L = LSTK(TOP)                    
  2678.          M = MSTK(TOP)                    
  2679.          N = NSTK(TOP)                    
  2680.    81 IF (FIN .GE. 14) GO TO 85           
  2681.       IF (M .EQ. 1 .OR. N .EQ. 1) GO TO 83                   
  2682.       IF (K.GE.0) MN=MIN0(M,N-K)          
  2683.       IF (K.LT.0) MN=MIN0(M+K,N)          
  2684.       MSTK(TOP) = MAX0(MN,0)              
  2685.       NSTK(TOP) = 1    
  2686.       IF (MN .LE. 0) GO TO 99             
  2687.       DO 82 I = 1, MN                     
  2688.          IF (K.GE.0) LS = L+(I-1)+(I+K-1)*M                  
  2689.          IF (K.LT.0) LS = L+(I-K-1)+(I-1)*M                  
  2690.          LL = L+I-1    
  2691.          STKR(LL) = STKR(LS)              
  2692.          STKI(LL) = STKI(LS)              
  2693.    82 CONTINUE         
  2694.       GO TO 99         
  2695.    83 N = MAX0(M,N)+IABS(K)               
  2696.       ERR = L+N*N - LSTK(BOT)             
  2697.       IF (ERR .GT. 0) CALL ERROR(17)      
  2698.       IF (ERR .GT. 0) RETURN              
  2699.       MSTK(TOP) = N    
  2700.       NSTK(TOP) = N    
  2701.       DO 84 JB = 1, N                     
  2702.       DO 84 IB = 1, N                     
  2703.          J = N+1-JB    
  2704.          I = N+1-IB    
  2705.          SR = 0.0D0    
  2706.          SI = 0.0D0    
  2707.          IF (K.GE.0) LS = L+I-1           
  2708.          IF (K.LT.0) LS = L+J-1           
  2709.          LL = L+I-1+(J-1)*N               
  2710.          IF (J-I .EQ. K) SR = STKR(LS)    
  2711.          IF (J-I .EQ. K) SI = STKI(LS)    
  2712.          STKR(LL) = SR                    
  2713.          STKI(LL) = SI                    
  2714.    84 CONTINUE         
  2715.       GO TO 99         
  2716. C                      
  2717. C     TRIL, TRIU       
  2718.    85 DO 87 J = 1, N   
  2719.          LD = L + J - K - 1 + (J-1)*M     
  2720.          IF (FIN .EQ. 14) LL = J - K - 1  
  2721.          IF (FIN .EQ. 14) LS = LD - LL    
  2722.          IF (FIN .EQ. 15) LL = M - J + K  
  2723.          IF (FIN .EQ. 15) LS = LD + 1     
  2724.          IF (LL .GT. 0) CALL WSET(LL,0.0D0,0.0D0,STKR(LS),STKI(LS),1)           
  2725.    87 CONTINUE         
  2726.       GO TO 99         
  2727. C                      
  2728. C     EYE, RAND, ONES                     
  2729.    90 IF (M.GT.1 .OR. RHS.EQ.0) GO TO 94  
  2730.       IF (RHS .NE. 2) GO TO 91            
  2731.         NN = IDINT(STKR(L))               
  2732.         TOP = TOP-1    
  2733.         L = LSTK(TOP)                     
  2734.         N = NSTK(TOP)                     
  2735.    91 IF (FIN.NE.7 .OR. N.LT.4) GO TO 93  
  2736.       DO 92 I = 1, 4   
  2737.         LS = L+I-1     
  2738.         ID(I) = IDINT(STKR(LS))           
  2739.    92 CONTINUE         
  2740.       IF (EQID(ID,UNIFOR).OR.EQID(ID,NORMAL)) GO TO 97       
  2741.       IF (EQID(ID,SEED)) GO TO 98         
  2742.    93 IF (N .GT. 1) GO TO 94              
  2743.       M = MAX0(IDINT(STKR(L)),0)          
  2744.       IF (RHS .EQ. 2) N = MAX0(NN,0)      
  2745.       IF (RHS .NE. 2) N = M               
  2746.       ERR = L+M*N - LSTK(BOT)             
  2747.       IF (ERR .GT. 0) CALL ERROR(17)      
  2748.       IF (ERR .GT. 0) RETURN              
  2749.       MSTK(TOP) = M    
  2750.       NSTK(TOP) = N    
  2751.       IF (M*N .EQ. 0) GO TO 99            
  2752.    94 DO 96 J = 1, N   
  2753.       DO 96 I = 1, M   
  2754.         LL = L+I-1+(J-1)*M                
  2755.         STKR(LL) = 0.0D0                  
  2756.         STKI(LL) = 0.0D0                  
  2757.         IF (I.EQ.J .OR. FIN.EQ.8) STKR(LL) = 1.0D0           
  2758.         IF (FIN.EQ.7 .AND. RAN(2).EQ.0) STKR(LL) = FLOP(URAND(RAN(1)))          
  2759.         IF (FIN.NE.7 .OR. RAN(2).EQ.0) GO TO 96              
  2760.    95      SR = 2.0D0*URAND(RAN(1))-1.0D0                    
  2761.            SI = 2.0D0*URAND(RAN(1))-1.0D0                    
  2762.            T = SR*SR + SI*SI              
  2763.            IF (T .GT. 1.0D0) GO TO 95     
  2764.         STKR(LL) = FLOP(SR*DSQRT(-2.0D0*DLOG(T)/T))          
  2765.    96 CONTINUE         
  2766.       GO TO 99         
  2767. C                      
  2768. C     SWITCH UNIFORM AND NORMAL           
  2769.    97 RAN(2) = ID(1) - UNIFOR(1)          
  2770.       MSTK(TOP) = 0    
  2771.       GO TO 99         
  2772. C                      
  2773. C     SEED             
  2774.    98 IF (RHS .EQ. 2) RAN(1) = NN         
  2775.       STKR(L) = RAN(1)                    
  2776.       MSTK(TOP) = 1    
  2777.       IF (RHS .EQ. 2) MSTK(TOP) = 0       
  2778.       NSTK(TOP) = 1    
  2779.       GO TO 99         
  2780. C                      
  2781.    99 RETURN           
  2782.       END
  2783.       SUBROUTINE MATLAB(INIT)             
  2784. C     INIT = 0 FOR ORDINARY FIRST ENTRY   
  2785. C          = POSITIVE FOR SUBSEQUENT ENTRIES                 
  2786. C          = NEGATIVE FOR SILENT INITIALIZATION (SEE MATZ)   
  2787. C                      
  2788.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  2789.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  2790.       INTEGER ALFA(52),ALFB(52),ALFL,CASE                    
  2791.       INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ       
  2792.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  2793.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  2794.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  2795.       COMMON /ALFS/ ALFA,ALFB,ALFL,CASE   
  2796.       COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ               
  2797.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  2798.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  2799. C                      
  2800.       DOUBLE PRECISION S,T                
  2801.       INTEGER EPS(4),FLOPS(4),EYE(4),RAND(4)                 
  2802. C                      
  2803. C     CHARACTER SET    
  2804. C            0       10       20       30       40       50  
  2805. C                      
  2806. C     0      0        A        K        U   COLON  :  LESS   <                  
  2807. C     1      1        B        L        V   PLUS   +  GREAT  >                  
  2808. C     2      2        C        M        W   MINUS  -         
  2809. C     3      3        D        N        X   STAR   *         
  2810. C     4      4        E        O        Y   SLASH  /         
  2811. C     5      5        F        P        Z   BSLASH \         
  2812. C     6      6        G        Q  BLANK     EQUAL  =         
  2813. C     7      7        H        R  LPAREN (  DOT    .         
  2814. C     8      8        I        S  RPAREN )  COMMA  ,         
  2815. C     9      9        J        T  SEMI   ;  QUOTE  '         
  2816. C                      
  2817.       INTEGER ALPHA(52),ALPHB(52)         
  2818.       DATA ALPHA /1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9,   
  2819.      $    1HA,1HB,1HC,1HD,1HE,1HF,1HG,1HH,1HI,1HJ,           
  2820.      $    1HK,1HL,1HM,1HN,1HO,1HP,1HQ,1HR,1HS,1HT,           
  2821.      $    1HU,1HV,1HW,1HX,1HY,1HZ,1H ,1H(,1H),1H;,           
  2822.      $    1H:,1H+,1H-,1H*,1H/,1H\,1H=,1H.,1H,,1H',           
  2823.      $    1H<,1H>/     
  2824. C                      
  2825. C     ALTERNATE CHARACTER SET             
  2826. C                      
  2827.       DATA ALPHB /1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9,   
  2828.      $    1Ha,1Hb,1Hc,1Hd,1He,1Hf,1Hg,1Hh,1Hi,1Hj,           
  2829.      $    1Hk,1Hl,1Hm,1Hn,1Ho,1Hp,1Hq,1Hr,1Hs,1Ht,           
  2830.      $    1Hu,1Hv,1Hw,1Hx,1Hy,1Hz,1H ,1H(,1H),1H;,           
  2831.      $    1H|,1H+,1H-,1H*,1H/,1H$,1H=,1H.,1H,,1H",           
  2832.      $    1H[,1H]/     
  2833. C                      
  2834.       DATA EPS/14,25,28,36/,FLOPS/15,21,24,25/               
  2835.       DATA EYE/14,34,14,36/,RAND/27,10,23,13/                
  2836. C                      
  2837.       IF (INIT .GT. 0) GO TO 90           
  2838. C                      
  2839. C     RTE = UNIT NUMBER FOR TERMINAL INPUT                   
  2840.       RTE = 9          
  2841.       CALL FILES(RTE,BUF)                 
  2842.       RIO = RTE        
  2843. C                      
  2844. C     WTE = UNIT NUMBER FOR TERMINAL OUTPUT                  
  2845.       WTE = 9          
  2846.       CALL FILES(WTE,BUF)                 
  2847.       WIO = 0          
  2848. C                      
  2849.       IF (INIT .GE. 0) WRITE(WTE,100)     
  2850.   100 FORMAT(//1X,'     < M A T L A B >'  
  2851.      $  /1X,'   Version of 05/25/82')     
  2852. C                      
  2853. C     HIO = UNIT NUMBER FOR HELP FILE     
  2854.       HIO = 11          
  2855.       CALL FILES(HIO,BUF)                 
  2856. C                      
  2857. C     RANDOM NUMBER SEED                  
  2858.       RAN(1) = 0       
  2859. C                      
  2860. C     INITIAL LINE LIMIT                  
  2861.       LCT(2) = 25      
  2862. C                      
  2863.       ALFL = 52        
  2864.       CASE = 0         
  2865. C     CASE = 1 for file names in lower case                  
  2866.       DO 20 I = 1, ALFL                   
  2867.          ALFA(I) = ALPHA(I)               
  2868.          ALFB(I) = ALPHB(I)               
  2869.    20 CONTINUE         
  2870. C                      
  2871.       VSIZE = 5005     
  2872.       LSIZE = 48       
  2873.       PSIZE = 32       
  2874.       BOT = LSIZE-3    
  2875.       CALL WSET(5,0.0D0,0.0D0,STKR(VSIZE-4),STKI(VSIZE-4),1) 
  2876.       CALL PUTID(IDSTK(1,LSIZE-3),EPS)    
  2877.       LSTK(LSIZE-3) = VSIZE-4             
  2878.       MSTK(LSIZE-3) = 1                   
  2879.       NSTK(LSIZE-3) = 1                   
  2880.       S = 1.0D0        
  2881.    30 S = S/2.0D0      
  2882.       T = 1.0D0 + S    
  2883.       IF (T .GT. 1.0D0) GO TO 30          
  2884.       STKR(VSIZE-4) = 2.0D0*S             
  2885.       CALL PUTID(IDSTK(1,LSIZE-2),FLOPS)  
  2886.       LSTK(LSIZE-2) = VSIZE-3             
  2887.       MSTK(LSIZE-2) = 1                   
  2888.       NSTK(LSIZE-2) = 2                   
  2889.       CALL PUTID(IDSTK(1,LSIZE-1), EYE)   
  2890.       LSTK(LSIZE-1) = VSIZE-1             
  2891.       MSTK(LSIZE-1) = -1                  
  2892.       NSTK(LSIZE-1) = -1                  
  2893.       STKR(VSIZE-1) = 1.0D0               
  2894.       CALL PUTID(IDSTK(1,LSIZE), RAND)    
  2895.       LSTK(LSIZE) = VSIZE                 
  2896.       MSTK(LSIZE) = 1                     
  2897.       NSTK(LSIZE) = 1                     
  2898.       FMT = 1          
  2899.       FLP(1) = 0       
  2900.       FLP(2) = 0       
  2901.       DDT = 0          
  2902.       RAN(2) = 0       
  2903.       PTZ = 0          
  2904.       PT = PTZ         
  2905.       ERR = 0          
  2906.       IF (INIT .LT. 0) RETURN             
  2907. C                      
  2908.    90 CALL PARSE       
  2909.       IF (FUN .EQ. 1) CALL MATFN1         
  2910.       IF (FUN .EQ. 2) CALL MATFN2         
  2911.       IF (FUN .EQ. 3) CALL MATFN3         
  2912.       IF (FUN .EQ. 4) CALL MATFN4         
  2913.       IF (FUN .EQ. 5) CALL MATFN5         
  2914.       IF (FUN .EQ. 6) CALL MATFN6         
  2915.       IF (FUN .EQ. 21) CALL MATFN1        
  2916.       IF (FUN .NE. 99) GO TO 90           
  2917.       RETURN           
  2918.       END
  2919.                 
  2920.       SUBROUTINE PARSE                    
  2921.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  2922.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  2923.       INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ       
  2924.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  2925.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  2926.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  2927.       COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ               
  2928.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  2929.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  2930.       LOGICAL EQID     
  2931.       INTEGER SEMI,EQUAL,EOL,ID(4),EXCNT,LPAREN,RPAREN,COLON,PTS,ALFL           
  2932.       INTEGER BLANK,COMMA,LESS,GREAT,NAME,ANS(4),ENND(4),ELSE(4),P,R            
  2933.       DATA BLANK/36/,SEMI/39/,EQUAL/46/,EOL/99/,COMMA/48/,COLON/40/             
  2934.       DATA LPAREN/37/,RPAREN/38/,LESS/50/,GREAT/51/,NAME/1/,ALFL/52/            
  2935.       DATA ANS/10,23,28,36/,ENND/14,23,13,36/,ELSE/14,21,28,14/                 
  2936. C                      
  2937.    01 R = 0            
  2938.       IF (ERR .GT. 0) PTZ = 0             
  2939.       IF (ERR.LE.0 .AND. PT.GT.PTZ) R = RSTK(PT)             
  2940.       IF (DDT .EQ. 1) WRITE(WTE,100) PT,R,PTZ,ERR            
  2941.   100 FORMAT(1X,'PARSE ',4I4)             
  2942.       IF (R.EQ.15) GO TO 93               
  2943.       IF (R.EQ.16 .OR. R.EQ.17) GO TO 94  
  2944.       SYM = EOL        
  2945.       TOP = 0          
  2946.       IF (RIO .NE. RTE) CALL FILES(-1*RIO,BUF)                 
  2947.       RIO = RTE        
  2948.       LCT(3) = 0       
  2949.       LCT(4) = 2       
  2950.       LPT(1) = 1       
  2951.    10 IF (SYM.EQ.EOL .AND. MOD(LCT(4)/2,2).EQ.1) CALL PROMPT(LCT(4)/4)          
  2952.       IF (SYM .EQ. EOL) CALL GETLIN       
  2953.       ERR = 0          
  2954.       PT = PTZ         
  2955.    15 EXCNT = 0        
  2956.       IF (DDT .EQ. 1) WRITE(WTE,115) PT,TOP                  
  2957.   115 FORMAT(1X,'STATE ',2I4)             
  2958.       LHS = 1          
  2959.       CALL PUTID(ID,ANS)                  
  2960.       CALL GETSYM      
  2961.       IF (SYM.EQ.COLON .AND. CHAR.EQ.EOL) DDT = 1-DDT        
  2962.       IF (SYM .EQ. COLON) CALL GETSYM     
  2963.       IF (SYM.EQ.SEMI .OR. SYM.EQ.COMMA .OR. SYM.EQ.EOL) GO TO 80               
  2964.       IF (SYM .EQ. NAME) GO TO 20         
  2965.       IF (SYM .EQ. LESS) GO TO 40         
  2966.       IF (SYM .EQ. GREAT) GO TO 45        
  2967.       GO TO 50         
  2968. C                      
  2969. C     LHS BEGINS WITH NAME                
  2970.    20 CALL COMAND(SYN)                    
  2971.       IF (ERR .GT. 0) GO TO 01            
  2972.       IF (FUN .EQ. 99) GO TO 95           
  2973.       IF (FIN .EQ. -15) GO TO 80          
  2974.       IF (FIN .LT. 0) GO TO 91            
  2975.       IF (FIN .GT. 0) GO TO 70            
  2976. C     IF NAME IS A FUNCTION, MUST BE RHS  
  2977.       RHS = 0          
  2978.       CALL FUNS(SYN)   
  2979.       IF (FIN .NE. 0) GO TO 50            
  2980. C     PEEK ONE CHARACTER AHEAD            
  2981.       IF (CHAR.EQ.SEMI .OR. CHAR.EQ.COMMA .OR. CHAR.EQ.EOL)  
  2982.      $      CALL PUTID(ID,SYN)            
  2983.       IF (CHAR .EQ. EQUAL) GO TO 25       
  2984.       IF (CHAR .EQ. LPAREN) GO TO 30      
  2985.       GO TO 50         
  2986. C                      
  2987. C     LHS IS SIMPLE VARIABLE              
  2988.    25 CALL PUTID(ID,SYN)                  
  2989.       CALL GETSYM      
  2990.       CALL GETSYM      
  2991.       GO TO 50         
  2992. C                      
  2993. C     LHS IS NAME(...)                    
  2994.    30 LPT(5) = LPT(4)                     
  2995.       CALL PUTID(ID,SYN)                  
  2996.       CALL GETSYM      
  2997.    32 CALL GETSYM      
  2998.       EXCNT = EXCNT+1                     
  2999.       PT = PT+1        
  3000.       CALL PUTID(IDS(1,PT), ID)           
  3001.       PSTK(PT) = EXCNT                    
  3002.       RSTK(PT) = 1     
  3003. C     *CALL* EXPR      
  3004.       GO TO 92         
  3005.    35 CALL PUTID(ID,IDS(1,PT))            
  3006.       EXCNT = PSTK(PT)                    
  3007.       PT = PT-1        
  3008.       IF (SYM .EQ. COMMA) GO TO 32        
  3009.       IF (SYM .NE. RPAREN) CALL ERROR(3)  
  3010.       IF (ERR .GT. 0) GO TO 01            
  3011.       IF (ERR .GT. 0) RETURN              
  3012.       IF (SYM .EQ. RPAREN) CALL GETSYM    
  3013.       IF (SYM .EQ. EQUAL) GO TO 50        
  3014. C     LHS IS REALLY RHS, FORGET SCAN JUST DONE               
  3015.       TOP = TOP - EXCNT                   
  3016.       LPT(4) = LPT(5)                     
  3017.       CHAR = LPAREN    
  3018.       SYM = NAME       
  3019.       CALL PUTID(SYN,ID)                  
  3020.       CALL PUTID(ID,ANS)                  
  3021.       EXCNT = 0        
  3022.       GO TO 50         
  3023. C                      
  3024. C     MULTIPLE LHS     
  3025.    40 LPT(5) = LPT(4)                     
  3026.       PTS = PT         
  3027.       CALL GETSYM      
  3028.    41 IF (SYM .NE. NAME) GO TO 43         
  3029.       CALL PUTID(ID,SYN)                  
  3030.       CALL GETSYM      
  3031.       IF (SYM .EQ. GREAT) GO TO 42        
  3032.       IF (SYM .EQ. COMMA) CALL GETSYM     
  3033.       PT = PT+1        
  3034.       LHS = LHS+1      
  3035.       PSTK(PT) = 0     
  3036.       CALL PUTID(IDS(1,PT),ID)            
  3037.       GO TO 41         
  3038.    42 CALL GETSYM      
  3039.       IF (SYM .EQ. EQUAL) GO TO 50        
  3040.    43 LPT(4) = LPT(5)                     
  3041.       PT = PTS         
  3042.       LHS = 1          
  3043.       SYM = LESS       
  3044.       CHAR = LPT(4)-1                     
  3045.       CHAR = LIN(CHAR)                    
  3046.       CALL PUTID(ID,ANS)                  
  3047.       GO TO 50         
  3048. C                      
  3049. C     MACRO STRING     
  3050.    45 CALL GETSYM      
  3051.       IF (DDT .EQ. 1) WRITE(WTE,145) PT,TOP                  
  3052.   145 FORMAT(1X,'MACRO ',2I4)             
  3053.       IF (SYM.EQ.LESS .AND. CHAR.EQ.EOL) CALL ERROR(28)      
  3054.       IF (ERR .GT. 0) GO TO 01            
  3055.       PT = PT+1        
  3056.       RSTK(PT) = 20    
  3057. C     *CALL* EXPR      
  3058.       GO TO 92         
  3059.    46 PT = PT-1        
  3060.       IF (SYM.NE.LESS .AND. SYM.NE.EOL) CALL ERROR(37)       
  3061.       IF (ERR .GT. 0) GO TO 01            
  3062.       IF (SYM .EQ. LESS) CALL GETSYM      
  3063.       K = LPT(6)       
  3064.       LIN(K+1) = LPT(1)                   
  3065.       LIN(K+2) = LPT(2)                   
  3066.       LIN(K+3) = LPT(6)                   
  3067.       LPT(1) = K + 4   
  3068. C     TRANSFER STACK TO INPUT LINE        
  3069.       K = LPT(1)       
  3070.       L = LSTK(TOP)    
  3071.       N = MSTK(TOP)*NSTK(TOP)             
  3072.       DO 48 J = 1, N   
  3073.          LS = L + J-1                     
  3074.          LIN(K) = IDINT(STKR(LS))         
  3075.          IF (LIN(K).LT.0 .OR. LIN(K).GE.ALFL) CALL ERROR(37) 
  3076.          IF (ERR .GT. 0) RETURN           
  3077.          IF (K.LT.1024) K = K+1           
  3078.          IF (K.EQ.1024) WRITE(WTE,47) K   
  3079.    47    FORMAT(1X,'INPUT BUFFER LIMIT IS ',I4,' CHARACTERS.')                  
  3080.    48 CONTINUE         
  3081.       TOP = TOP-1      
  3082.       LIN(K) = EOL     
  3083.       LPT(6) = K       
  3084.       LPT(4) = LPT(1)                     
  3085.       LPT(3) = 0       
  3086.       LPT(2) = 0       
  3087.       LCT(1) = 0       
  3088.       CHAR = BLANK     
  3089.       PT = PT+1        
  3090.       PSTK(PT) = LPT(1)                   
  3091.       RSTK(PT) = 21    
  3092. C     *CALL* PARSE     
  3093.       GO TO 15         
  3094.    49 PT = PT-1        
  3095.       IF (DDT .EQ. 1) WRITE(WTE,149) PT,TOP                  
  3096.   149 FORMAT(1X,'MACEND',2I4)             
  3097.       K = LPT(1) - 4   
  3098.       LPT(1) = LIN(K+1)                   
  3099.       LPT(4) = LIN(K+2)                   
  3100.       LPT(6) = LIN(K+3)                   
  3101.       CHAR = BLANK     
  3102.       CALL GETSYM      
  3103.       GO TO 80         
  3104. C                      
  3105. C     LHS FINISHED, START RHS             
  3106.    50 IF (SYM .EQ. EQUAL) CALL GETSYM     
  3107.       PT = PT+1        
  3108.       CALL PUTID(IDS(1,PT),ID)            
  3109.       PSTK(PT) = EXCNT                    
  3110.       RSTK(PT) = 2     
  3111. C     *CALL* EXPR      
  3112.       GO TO 92         
  3113.    55 IF (SYM.EQ.SEMI .OR. SYM.EQ.COMMA .OR. SYM.EQ.EOL) GO TO 60               
  3114.       IF (SYM.EQ.NAME .AND. EQID(SYN,ELSE)) GO TO 60         
  3115.       IF (SYM.EQ.NAME .AND. EQID(SYN,ENND)) GO TO 60         
  3116.       CALL ERROR(40)   
  3117.       IF (ERR .GT. 0) GO TO 01            
  3118. C                      
  3119. C     STORE RESULTS    
  3120.    60 RHS = PSTK(PT)   
  3121.       CALL STACKP(IDS(1,PT))              
  3122.       IF (ERR .GT. 0) GO TO 01            
  3123.       PT = PT-1        
  3124.       LHS = LHS-1      
  3125.       IF (LHS .GT. 0) GO TO 60            
  3126.       GO TO 70         
  3127. C                      
  3128. C     UPDATE AND POSSIBLY PRINT OPERATION COUNTS             
  3129.    70 K = FLP(1)       
  3130.       IF (K .NE. 0) STKR(VSIZE-3) = DFLOAT(K)                
  3131.       STKR(VSIZE-2) = STKR(VSIZE-2) + DFLOAT(K)              
  3132.       FLP(1) = 0       
  3133.       IF (.NOT.(CHAR.EQ.COMMA .OR. (SYM.EQ.COMMA .AND. CHAR.EQ.EOL)))           
  3134.      $       GO TO 80                     
  3135.       CALL GETSYM      
  3136.       I5 = 10**5       
  3137.       LUNIT = WTE      
  3138.    71 IF (K .EQ. 0) WRITE(LUNIT,171)      
  3139.   171 FORMAT(/1X,'   no flops')           
  3140.       IF (K .EQ. 1) WRITE(LUNIT,172)      
  3141.   172 FORMAT(/1X,'    1 flop')            
  3142.       IF (1.LT.K .AND. K.LT.100000) WRITE(LUNIT,173) K       
  3143.   173 FORMAT(/1X,I5,' flops')             
  3144.       IF (100000 .LE. K) WRITE(LUNIT,174) K                  
  3145.   174 FORMAT(/1X,I9,' flops')             
  3146.       IF (LUNIT.EQ.WIO .OR. WIO.EQ.0) GO TO 80               
  3147.       LUNIT = WIO      
  3148.       GO TO 71         
  3149. C                      
  3150. C     FINISH STATEMENT                    
  3151.    80 FIN = 0          
  3152.       P = 0            
  3153.       R = 0            
  3154.       IF (PT .GT. 0) P = PSTK(PT)         
  3155.       IF (PT .GT. 0) R = RSTK(PT)         
  3156.       IF (DDT .EQ. 1) WRITE(WTE,180) PT,PTZ,P,R,LPT(1)       
  3157.   180 FORMAT(1X,'FINISH',5I4)             
  3158.       IF (SYM.EQ.COMMA .OR. SYM.EQ.SEMI) GO TO 15            
  3159.       IF (R.EQ.21 .AND. P.EQ.LPT(1)) GO TO 49                
  3160.       IF (PT .GT. PTZ) GO TO 91           
  3161.       GO TO 10         
  3162. C                      
  3163. C     SIMULATE RECURSION                  
  3164.    91 CALL CLAUSE      
  3165.       IF (ERR .GT. 0) GO TO 01            
  3166.       IF (PT .LE. PTZ) GO TO 15           
  3167.       R = RSTK(PT)     
  3168.       IF (R .EQ. 21) GO TO 49             
  3169.       GO TO (99,99,92,92,92,99,99,99,99,99,99,99,15,15,99,99,99,99,99),R        
  3170. C                      
  3171.    92 CALL EXPR        
  3172.       IF (ERR .GT. 0) GO TO 01            
  3173.       R = RSTK(PT)     
  3174.       GO TO (35,55,91,91,91,93,93,99,99,94,94,99,99,99,99,99,99,94,94,          
  3175.      $       46),R     
  3176. C                      
  3177.    93 CALL TERM        
  3178.       IF (ERR .GT. 0) GO TO 01            
  3179.       R = RSTK(PT)     
  3180.       GO TO (99,99,99,99,99,92,92,94,94,99,99,99,99,99,95,99,99,99,99),R        
  3181. C                      
  3182.    94 CALL FACTOR      
  3183.       IF (ERR .GT. 0) GO TO 01            
  3184.       R = RSTK(PT)     
  3185.       GO TO (99,99,99,99,99,99,99,93,93,92,92,94,99,99,99,95,95,92,92),R        
  3186. C                      
  3187. C     CALL MATFNS BY RETURNING TO MATLAB  
  3188.    95 IF (FIN.GT.0 .AND. MSTK(TOP).LT.0) CALL ERROR(14)      
  3189.       IF (ERR .GT. 0) GO TO 01            
  3190.       RETURN           
  3191. C                      
  3192.    99 CALL ERROR(22)   
  3193.       GO TO 01         
  3194.       END
  3195.              
  3196.       SUBROUTINE PLOT(LUNIT,X,Y,N,P,K,BUF)                   
  3197.       DOUBLE PRECISION X(N),Y(N),P(1)     
  3198.       INTEGER BUF(79)                     
  3199. C                      
  3200. C     PLOT X VS. Y ON LUNIT               
  3201. C     IF K IS NONZERO, THEN P(1),...,P(K) ARE EXTRA PARAMETERS                  
  3202. C     BUF IS WORK SPACE                   
  3203. C                      
  3204.       DOUBLE PRECISION XMIN,YMIN,XMAX,YMAX,DY,DX,Y1,Y0       
  3205.       INTEGER AST,BLANK,H,W               
  3206.       DATA AST/1H*/,BLANK/1H /,H/20/,W/79/                   
  3207. C                      
  3208. C     H = HEIGHT, W = WIDTH               
  3209. C                      
  3210.       IF (K .GT. 0) WRITE(LUNIT,01) (P(I), I=1,K)            
  3211.    01 FORMAT('Extra parameters',10f5.1)   
  3212.       XMIN = X(1)      
  3213.       XMAX = X(1)      
  3214.       YMIN = Y(1)      
  3215.       YMAX = Y(1)      
  3216.       DO 10 I = 1, N   
  3217.          XMIN = DMIN1(XMIN,X(I))          
  3218.          XMAX = DMAX1(XMAX,X(I))          
  3219.          YMIN = DMIN1(YMIN,Y(I))          
  3220.          YMAX = DMAX1(YMAX,Y(I))          
  3221.    10 CONTINUE         
  3222.       DX = XMAX - XMIN                    
  3223.       IF (DX .EQ. 0.0D0) DX = 1.0D0       
  3224.       DY = YMAX - YMIN                    
  3225.       WRITE(LUNIT,35)                     
  3226.       DO 40 L = 1, H   
  3227.          DO 20 J = 1, W                   
  3228.             BUF(J) = BLANK                
  3229.    20    CONTINUE      
  3230.          Y1 = YMIN + (H-L+1)*DY/H         
  3231.          Y0 = YMIN + (H-L)*DY/H           
  3232.          JMAX = 1      
  3233.          DO 30 I = 1, N                   
  3234.             IF (Y(I) .GT. Y1) GO TO 30    
  3235.             IF (L.NE.H .AND. Y(I).LE.Y0) GO TO 30            
  3236.             J = 1 + (W-1)*(X(I) - XMIN)/DX                   
  3237.             BUF(J) = AST                  
  3238.             JMAX = MAX0(JMAX,J)           
  3239.    30    CONTINUE      
  3240.          WRITE(LUNIT,35) (BUF(J),J=1,JMAX)                   
  3241.    35    FORMAT(79A1)                     
  3242.    40 CONTINUE         
  3243.       RETURN           
  3244.       END 
  3245.               
  3246.       SUBROUTINE PRINT(ID,K)              
  3247. C     PRIMARY OUTPUT ROUTINE              
  3248.       INTEGER ID(4),K                     
  3249.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  3250.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  3251.       INTEGER ALFA(52),ALFB(52),ALFL,CASE                    
  3252.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  3253.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  3254.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  3255.       COMMON /ALFS/ ALFA,ALFB,ALFL,CASE   
  3256.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  3257.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  3258.       DOUBLE PRECISION S,TR,TI,PR(12),PI(12),ROUND           
  3259.       INTEGER FNO(11),FNL(11),SIG(12),PLUS,MINUS,BLANK,TYP,F 
  3260.       DATA PLUS/41/,MINUS/42/,BLANK/36/   
  3261. C     FORMAT NUMBERS AND LENGTHS          
  3262.       DATA FNO /11,12,21,22,23,24,31,32,33,34,-1/            
  3263.       DATA FNL /12, 6, 8, 4, 6, 3, 4, 2, 3, 1, 1/            
  3264. C     FMT   1       2       3       4       5                
  3265. C         SHORT   LONG   SHORT E  LONG E    Z                
  3266. C     TYP   1       2       3             
  3267. C         INTEGER  REAL   COMPLEX         
  3268.       IF (LCT(1) .LT. 0) GO TO 99         
  3269.       L = LSTK(K)      
  3270.       M = MSTK(K)      
  3271.       N = NSTK(K)      
  3272.       MN = M*N         
  3273.       TYP = 1          
  3274.       S = 0.0D0        
  3275.       DO 10 I = 1, MN                     
  3276.         LS = L+I-1     
  3277.         TR = STKR(LS)                     
  3278.         TI = STKI(LS)                     
  3279.         S = DMAX1(S,DABS(TR),DABS(TI))    
  3280.         IF (ROUND(TR) .NE. TR) TYP = MAX0(2,TYP)             
  3281.         IF (TI .NE. 0.0D0) TYP = 3        
  3282.    10 CONTINUE         
  3283.       IF (S .NE. 0.0D0) S = DLOG10(S)     
  3284.       KS = IDINT(S)    
  3285.       IF (-2 .LE. KS .AND. KS .LE. 1) KS = 0                 
  3286.       IF (KS .EQ. 2 .AND. FMT .EQ. 1 .AND. TYP .EQ. 2) KS = 0                   
  3287.       IF (TYP .EQ. 1 .AND. KS .LE. 2) F = 1                  
  3288.       IF (TYP .EQ. 1 .AND. KS .GT. 2) F = 2                  
  3289.       IF (TYP .EQ. 1 .AND. KS .GT. 9) TYP = 2                
  3290.       IF (TYP .EQ. 2) F = FMT + 2         
  3291.       IF (TYP .EQ. 3) F = FMT + 6         
  3292.       IF (MN.EQ.1 .AND. KS.NE.0 .AND. FMT.LT.3 .AND. TYP.NE.1) F = F+2          
  3293.       IF (FMT .EQ. 5) F = 11              
  3294.       JINC = FNL(F)    
  3295.       F = FNO(F)       
  3296.       S = 1.0D0        
  3297.       IF (F.EQ.21 .OR. F.EQ.22 .OR. F.EQ.31 .OR. F.EQ.32) S = 10.0D0**KS        
  3298.       LS = ((N-1)/JINC+1)*M + 2           
  3299.       IF (LCT(1) + LS .LE. LCT(2)) GO TO 20                  
  3300.          LCT(1) = 0    
  3301.          WRITE(WTE,43) LS                 
  3302.          READ(RTE,44,END=19) LS           
  3303. CDC..    IF (EOF(RTE).NE.0) GO TO 19      
  3304.          IF (LS .EQ. ALFA(BLANK+1)) GO TO 20                 
  3305.          LCT(1) = -1   
  3306.          GO TO 99      
  3307.    19    CALL FILES(-1*RTE,BUF)             
  3308.    20 CONTINUE         
  3309.       WRITE(WTE,44)    
  3310.       IF (WIO .NE. 0) WRITE(WIO,44)       
  3311.       CALL PRNTID(ID,-1)                  
  3312.       LCT(1) = LCT(1)+2                   
  3313.       LUNIT = WTE      
  3314.    50 IF (S .NE. 1.0D0) WRITE(LUNIT,41) S                    
  3315.       DO 80 J1 = 1, N, JINC               
  3316.         J2 = MIN0(N, J1+JINC-1)           
  3317.         WRITE(LUNIT,44)                   
  3318.         IF (N .GT. JINC) WRITE(LUNIT,42) J1,J2               
  3319.         DO 70 I = 1, M                    
  3320.           JM = J2-J1+1                    
  3321.           DO 60 J = 1, JM                 
  3322.              LS = L+I-1+(J+J1-2)*M        
  3323.              PR(J) = STKR(LS)/S           
  3324.              PI(J) = DABS(STKI(LS)/S)     
  3325.              SIG(J) = ALFA(PLUS+1)        
  3326.              IF (STKI(LS) .LT. 0.0D0) SIG(J) = ALFA(MINUS+1) 
  3327.    60     CONTINUE     
  3328.           IF (F .EQ. 11) WRITE(LUNIT,11)(PR(J),J=1,JM)       
  3329.           IF (F .EQ. 12) WRITE(LUNIT,12)(PR(J),J=1,JM)       
  3330.           IF (F .EQ. 21) WRITE(LUNIT,21)(PR(J),J=1,JM)       
  3331.           IF (F .EQ. 22) WRITE(LUNIT,22)(PR(J),J=1,JM)       
  3332.           IF (F .EQ. 23) WRITE(LUNIT,23)(PR(J),J=1,JM)       
  3333.           IF (F .EQ. 24) WRITE(LUNIT,24)(PR(J),J=1,JM)       
  3334.           IF (F .EQ. 31) WRITE(LUNIT,31)(PR(J),SIG(J),PI(J),J=1,JM)             
  3335.           IF (F .EQ. 32) WRITE(LUNIT,32)(PR(J),SIG(J),PI(J),J=1,JM)             
  3336.           IF (F .EQ. 33) WRITE(LUNIT,33)(PR(J),SIG(J),PI(J),J=1,JM)             
  3337.           IF (F .EQ. 34) WRITE(LUNIT,34)(PR(J),SIG(J),PI(J),J=1,JM)             
  3338.           IF (F .EQ. -1) CALL FORMZ(LUNIT,STKR(LS),STKI(LS)) 
  3339.           LCT(1) = LCT(1)+1               
  3340.    70   CONTINUE       
  3341.    80 CONTINUE         
  3342.       IF (LUNIT.EQ.WIO .OR. WIO.EQ.0) GO TO 99               
  3343.       LUNIT = WIO      
  3344.       GO TO 50         
  3345.    99 RETURN           
  3346. C                      
  3347.    11 FORMAT(1X,12F6.0)                   
  3348.    12 FORMAT(1X,6F12.0)                   
  3349.    21 FORMAT(1X,F9.4,7F10.4)              
  3350.    22 FORMAT(1X,F19.15,3F20.15)           
  3351.    23 FORMAT(1X,1P6D13.4)                 
  3352.    24 FORMAT(1X,1P3D24.15)                
  3353.    31 FORMAT(1X,4(F9.4,' ',A1,F7.4,'i'))  
  3354.    32 FORMAT(1X,F19.15,A1,F18.15,'i',F20.15,A1,F18.15,'i')   
  3355.    33 FORMAT(1X,3(1PD13.4,' ',A1,1PD10.4,'i'))               
  3356.    34 FORMAT(1X,1PD24.15,' ',A1,1PD21.15,'i')                
  3357.    41 FORMAT(/1X,' ',1PD9.1,2H *)         
  3358.    42 FORMAT(1X,'    COLUMNS',I3,' THRU',I3)                 
  3359.    43 FORMAT(/1X,'AT LEAST ',I5,' MORE LINES.',              
  3360.      $       '  ENTER BLANK LINE TO CONTINUE OUTPUT.')       
  3361.    44 FORMAT(A1)       
  3362. C                      
  3363.       END
  3364.               
  3365.       SUBROUTINE PRNTID(ID,ARGCNT)        
  3366. C     PRINT VARIABLE NAMES                
  3367.       INTEGER ID(4,1),ARGCNT              
  3368.       INTEGER ALFA(52),ALFB(52),ALFL,CASE                    
  3369.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  3370.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  3371.       COMMON /ALFS/ ALFA,ALFB,ALFL,CASE   
  3372.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  3373.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  3374.       INTEGER EQUAL    
  3375.       DATA EQUAL/46/   
  3376.       J1 = 1           
  3377.    10 J2 = MIN0(J1+7,IABS(ARGCNT))        
  3378.       L = 0            
  3379.       DO 15 J = J1,J2                     
  3380.       DO 15 I = 1, 4   
  3381.       K = ID(I,J)+1    
  3382.       L = L+1          
  3383.       BUF(L) = ALFA(K)                    
  3384.    15 CONTINUE         
  3385.       IF (ARGCNT .EQ. -1) L=L+1           
  3386.       IF (ARGCNT .EQ. -1) BUF(L) = ALFA(EQUAL+1)             
  3387.       WRITE(WTE,20) (BUF(I),I=1,L)        
  3388.       IF (WIO .NE. 0) WRITE(WIO,20) (BUF(I),I=1,L)           
  3389.    20 FORMAT(1X,8(4A1,2H  ))              
  3390.       J1 = J1+8        
  3391.       IF (J1 .LE. IABS(ARGCNT)) GO TO 10  
  3392.       RETURN           
  3393.       END
  3394.              
  3395.       SUBROUTINE PROMPT(PAUSE)            
  3396.       INTEGER PAUSE    
  3397. C                      
  3398. C     ISSUE MATLAB PROMPT WITH OPTIONAL PAUSE                
  3399. C                      
  3400.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  3401.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  3402.       WRITE(WTE,10)    
  3403.       IF (WIO .NE. 0) WRITE(WIO,10)       
  3404.    10 FORMAT(/1X,'<>',$)                    
  3405.       IF (PAUSE .EQ. 1) READ(RTE,20) DUMMY                   
  3406.    20 FORMAT(A1)       
  3407.       RETURN           
  3408.       END 
  3409.               
  3410.       DOUBLE PRECISION FUNCTION PYTHAG(A,B)                  
  3411.       DOUBLE PRECISION A,B                
  3412.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  3413.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  3414.       DOUBLE PRECISION P,Q,R,S,T          
  3415.       P = DMAX1(DABS(A),DABS(B))          
  3416.       Q = DMIN1(DABS(A),DABS(B))          
  3417.       IF (Q .EQ. 0.0D0) GO TO 20          
  3418.       IF (DDT .EQ. 25) WRITE(WTE,1)       
  3419.       IF (DDT .EQ. 25) WRITE(WTE,2) P,Q   
  3420.     1 FORMAT(1X,'PYTHAG',1P2D23.15)       
  3421.     2 FORMAT(1X,1P2D23.15)                
  3422.    10 R = (Q/P)**2     
  3423.       T = 4.0D0 + R    
  3424.       IF (T .EQ. 4.0D0) GO TO 20          
  3425.       S = R/T          
  3426.       P = P + 2.0D0*P*S                   
  3427.       Q = Q*S          
  3428.       IF (DDT .EQ. 25) WRITE(WTE,2) P,Q   
  3429.       GO TO 10         
  3430.    20 PYTHAG = P       
  3431.       RETURN           
  3432.       END
  3433.               
  3434.       SUBROUTINE RAT(X,LEN,MAXD,A,B,D)    
  3435.       INTEGER LEN,MAXD                    
  3436.       DOUBLE PRECISION X,A,B,D(LEN)       
  3437. C                      
  3438. C     A/B = CONTINUED FRACTION APPROXIMATION TO X            
  3439. C           USING  LEN  TERMS EACH LESS THAN MAXD            
  3440. C                      
  3441.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  3442.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  3443.       DOUBLE PRECISION S,T,Z,ROUND        
  3444.       Z = X            
  3445.       DO 10 I = 1, LEN                    
  3446.          K = I         
  3447.          D(K) = ROUND(Z)                  
  3448.          Z = Z - D(K)                     
  3449.          IF (DABS(Z)*DFLOAT(MAXD) .LE. 1.0D0) GO TO 20       
  3450.          Z = 1.0D0/Z   
  3451.    10 CONTINUE         
  3452.    20 T = D(K)         
  3453.       S = 1.0D0        
  3454.       IF (K .LT. 2) GO TO 40              
  3455.       DO 30 IB = 2, K                     
  3456.          I = K+1-IB    
  3457.          Z = T         
  3458.          T = D(I)*T + S                   
  3459.          S = Z         
  3460.    30 CONTINUE         
  3461.    40 IF (S .LT. 0.0D0) T = -T            
  3462.       IF (S .LT. 0.0D0) S = -S            
  3463.       IF (DDT .EQ. 27) WRITE(WTE,50) X,T,S,(D(I),I=1,K)      
  3464.    50 FORMAT(/1X,1PD23.15,0PF8.0,' /',F8.0,4X,6F5.0/(1X,45X,6F5.0))             
  3465.       A = T            
  3466.       B = S            
  3467.       RETURN           
  3468.       END              
  3469.               
  3470.       SUBROUTINE SAVLOD(LUNIT,ID,M,N,IMG,JOB,XREAL,XIMAG)    
  3471.       INTEGER LUNIT,ID(4),M,N,IMG,JOB     
  3472.       DOUBLE PRECISION XREAL(1),XIMAG(1)  
  3473. C                      
  3474. C     IMPLEMENT SAVE AND LOAD             
  3475. C     LUNIT = LOGICAL UNIT NUMBER         
  3476. C     ID = NAME, FORMAT 4A1               
  3477. C     M, N = DIMENSIONS                   
  3478. C     IMG = NONZERO IF XIMAG IS NONZERO   
  3479. C     JOB = 0     FOR SAVE                
  3480. C         = SPACE AVAILABLE FOR LOAD      
  3481. C     XREAL, XIMAG = REAL AND OPTIONAL IMAGINARY PARTS       
  3482. C                      
  3483. C     SYSTEM DEPENDENT FORMATS            
  3484.   101 FORMAT(4A1,3I4)                     
  3485.   102 FORMAT(4Z18)     
  3486. C                      
  3487.       IF (JOB .GT. 0) GO TO 20            
  3488. C                      
  3489. C     SAVE             
  3490.    10 WRITE(LUNIT,101) ID,M,N,IMG         
  3491.       DO 15 J = 1, N   
  3492.          K = (J-1)*M+1                    
  3493.          L = J*M       
  3494.          WRITE(LUNIT,102) (XREAL(I),I=K,L)                   
  3495.          IF (IMG .NE. 0) WRITE(LUNIT,102) (XIMAG(I),I=K,L)   
  3496.    15 CONTINUE         
  3497.       RETURN           
  3498. C                      
  3499. C     LOAD             
  3500.    20 READ(LUNIT,101,END=30) ID,M,N,IMG   
  3501.       IF (M*N .GT. JOB) GO TO 30          
  3502.       DO 25 J = 1, N   
  3503.          K = (J-1)*M+1                    
  3504.          L = J*M       
  3505.          READ(LUNIT,102,END=30) (XREAL(I),I=K,L)             
  3506.          IF (IMG .NE. 0) READ(LUNIT,102,END=30) (XIMAG(I),I=K,L)                
  3507.    25 CONTINUE         
  3508.       RETURN           
  3509. C                      
  3510. C     END OF FILE      
  3511.    30 M = 0            
  3512.       N = 0            
  3513.       RETURN           
  3514.       END 
  3515.               
  3516.       SUBROUTINE STACK1(OP)               
  3517.       INTEGER OP       
  3518. C                      
  3519. C     UNARY OPERATIONS                    
  3520. C                      
  3521.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  3522.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  3523.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  3524.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  3525.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  3526.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  3527.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  3528.       INTEGER QUOTE    
  3529.       DATA QUOTE/49/   
  3530.       IF (DDT .EQ. 1) WRITE(WTE,100) OP   
  3531.   100 FORMAT(1X,'STACK1',I4)              
  3532.       L = LSTK(TOP)    
  3533.       M = MSTK(TOP)    
  3534.       N = NSTK(TOP)    
  3535.       MN = M*N         
  3536.       IF (MN .EQ. 0) GO TO 99             
  3537.       IF (OP .EQ. QUOTE) GO TO 30         
  3538. C                      
  3539. C     UNARY MINUS      
  3540.       CALL WRSCAL(MN,-1.0D0,STKR(L),STKI(L),1)               
  3541.       GO TO 99         
  3542. C                      
  3543. C     TRANSPOSE        
  3544.    30 LL = L + MN      
  3545.       ERR = LL+MN - LSTK(BOT)             
  3546.       IF (ERR .GT. 0) CALL ERROR(17)      
  3547.       IF (ERR .GT. 0) RETURN              
  3548.       CALL WCOPY(MN,STKR(L),STKI(L),1,STKR(LL),STKI(LL),1)   
  3549.       M = NSTK(TOP)    
  3550.       N = MSTK(TOP)    
  3551.       MSTK(TOP) = M    
  3552.       NSTK(TOP) = N    
  3553.       DO 50 I = 1, M   
  3554.       DO 50 J = 1, N   
  3555.         LS = L+MN+(J-1)+(I-1)*N           
  3556.         LL = L+(I-1)+(J-1)*M              
  3557.         STKR(LL) = STKR(LS)               
  3558.         STKI(LL) = -STKI(LS)              
  3559.    50 CONTINUE         
  3560.       GO TO 99         
  3561.    99 RETURN           
  3562.       END              
  3563.       SUBROUTINE STACK2(OP)               
  3564.       INTEGER OP       
  3565. C                      
  3566. C     BINARY AND TERNARY OPERATIONS       
  3567. C                      
  3568.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  3569.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  3570.       INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ       
  3571.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  3572.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  3573.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  3574.       COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ               
  3575.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  3576.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  3577.       DOUBLE PRECISION WDOTUR,WDOTUI      
  3578.       DOUBLE PRECISION SR,SI,E1,ST,E2,FLOP                   
  3579.       INTEGER PLUS,MINUS,STAR,DSTAR,SLASH,BSLASH,DOT,COLON   
  3580.       DATA PLUS/41/,MINUS/42/,STAR/43/,DSTAR/54/,SLASH/44/   
  3581.       DATA BSLASH/45/,DOT/47/,COLON/40/   
  3582. C                      
  3583.       IF (DDT .EQ. 1) WRITE(WTE,100) OP   
  3584.   100 FORMAT(1X,'STACK2',I4)              
  3585.       L2 = LSTK(TOP)   
  3586.       M2 = MSTK(TOP)   
  3587.       N2 = NSTK(TOP)   
  3588.       TOP = TOP-1      
  3589.       L = LSTK(TOP)    
  3590.       M = MSTK(TOP)    
  3591.       N = NSTK(TOP)    
  3592.       FUN = 0          
  3593.       IF (OP .EQ. PLUS) GO TO 01          
  3594.       IF (OP .EQ. MINUS) GO TO 03         
  3595.       IF (OP .EQ. STAR) GO TO 05          
  3596.       IF (OP .EQ. DSTAR) GO TO 30         
  3597.       IF (OP .EQ. SLASH) GO TO 20         
  3598.       IF (OP .EQ. BSLASH) GO TO 25        
  3599.       IF (OP .EQ. COLON) GO TO 60         
  3600.       IF (OP .GT. 2*DOT) GO TO 80         
  3601.       IF (OP .GT. DOT) GO TO 70           
  3602. C                      
  3603. C     ADDITION         
  3604.    01 IF (M .LT. 0) GO TO 50              
  3605.       IF (M2 .LT. 0) GO TO 52             
  3606.       IF (M .NE. M2) CALL ERROR(8)        
  3607.       IF (ERR .GT. 0) RETURN              
  3608.       IF (N .NE. N2) CALL ERROR(8)        
  3609.       IF (ERR .GT. 0) RETURN              
  3610.       CALL WAXPY(M*N,1.0D0,0.0D0,STKR(L2),STKI(L2),1,        
  3611.      $            STKR(L),STKI(L),1)      
  3612.       GO TO 99         
  3613. C                      
  3614. C     SUBTRACTION      
  3615.    03 IF (M .LT. 0) GO TO 54              
  3616.       IF (M2 .LT. 0) GO TO 56             
  3617.       IF (M .NE. M2) CALL ERROR(9)        
  3618.       IF (ERR .GT. 0) RETURN              
  3619.       IF (N .NE. N2) CALL ERROR(9)        
  3620.       IF (ERR .GT. 0) RETURN              
  3621.       CALL WAXPY(M*N,-1.0D0,0.0D0,STKR(L2),STKI(L2),1,       
  3622.      $            STKR(L),STKI(L),1)      
  3623.       GO TO 99         
  3624. C                      
  3625. C     MULTIPLICATION   
  3626.    05 IF (M2*M2*N2 .EQ. 1) GO TO 10       
  3627.       IF (M*N .EQ. 1) GO TO 11            
  3628.       IF (M2*N2 .EQ. 1) GO TO 10          
  3629.       IF (N .NE. M2) CALL ERROR(10)       
  3630.       IF (ERR .GT. 0) RETURN              
  3631.       MN = M*N2        
  3632.       LL = L + MN      
  3633.       ERR = LL+M*N+M2*N2 - LSTK(BOT)      
  3634.       IF (ERR .GT. 0) CALL ERROR(17)      
  3635.       IF (ERR .GT. 0) RETURN              
  3636.       CALL WCOPY(M*N+M2*N2,STKR(L),STKI(L),-1,STKR(LL),STKI(LL),-1)             
  3637.       DO 08 J = 1, N2                     
  3638.       DO 08 I = 1, M   
  3639.         K1 = L + MN + (I-1)               
  3640.         K2 = L2 + MN + (J-1)*M2           
  3641.         K = L + (I-1) + (J-1)*M           
  3642.         STKR(K) = WDOTUR(N,STKR(K1),STKI(K1),M,STKR(K2),STKI(K2),1)             
  3643.         STKI(K) = WDOTUI(N,STKR(K1),STKI(K1),M,STKR(K2),STKI(K2),1)             
  3644.    08 CONTINUE         
  3645.       NSTK(TOP) = N2   
  3646.       GO TO 99         
  3647. C                      
  3648. C     MULTIPLICATION BY SCALAR            
  3649.    10 SR = STKR(L2)    
  3650.       SI = STKI(L2)    
  3651.       L1 = L           
  3652.       GO TO 13         
  3653.    11 SR = STKR(L)     
  3654.       SI = STKI(L)     
  3655.       L1 = L+1         
  3656.       MSTK(TOP) = M2   
  3657.       NSTK(TOP) = N2   
  3658.    13 MN = MSTK(TOP)*NSTK(TOP)            
  3659.       CALL WSCAL(MN,SR,SI,STKR(L1),STKI(L1),1)               
  3660.       IF (L1.NE.L)     
  3661.      $   CALL WCOPY(MN,STKR(L1),STKI(L1),1,STKR(L),STKI(L),1)                   
  3662.       GO TO 99         
  3663. C                      
  3664. C     RIGHT DIVISION   
  3665.    20 IF (M2*N2 .EQ. 1) GO TO 21          
  3666.       IF (M2 .EQ. N2) FUN = 1             
  3667.       IF (M2 .NE. N2) FUN = 4             
  3668.       FIN = -1         
  3669.       RHS = 2          
  3670.       GO TO 99         
  3671.    21 SR = STKR(L2)    
  3672.       SI = STKI(L2)    
  3673.       MN = M*N         
  3674.       DO 22 I = 1, MN                     
  3675.          LL = L+I-1    
  3676.          CALL WDIV(STKR(LL),STKI(LL),SR,SI,STKR(LL),STKI(LL))                   
  3677.          IF (ERR .GT. 0) RETURN           
  3678.    22 CONTINUE         
  3679.       GO TO 99         
  3680. C                      
  3681. C     LEFT DIVISION    
  3682.    25 IF (M*N .EQ. 1) GO TO 26            
  3683.       IF (M .EQ. N) FUN = 1               
  3684.       IF (M .NE. N) FUN = 4               
  3685.       FIN = -2         
  3686.       RHS = 2          
  3687.       GO TO 99         
  3688.    26 SR = STKR(L)     
  3689.       SI = STKI(L)     
  3690.       MSTK(TOP) = M2   
  3691.       NSTK(TOP) = N2   
  3692.       MN = M2*N2       
  3693.       DO 27 I = 1, MN                     
  3694.          LL = L+I-1    
  3695.          CALL WDIV(STKR(LL+1),STKI(LL+1),SR,SI,STKR(LL),STKI(LL))               
  3696.          IF (ERR .GT. 0) RETURN           
  3697.    27 CONTINUE         
  3698.       GO TO 99         
  3699. C                      
  3700. C     POWER            
  3701.    30 IF (M2*N2 .NE. 1) CALL ERROR(30)    
  3702.       IF (ERR .GT. 0) RETURN              
  3703.       IF (M .NE. N) CALL ERROR(20)        
  3704.       IF (ERR .GT. 0) RETURN              
  3705.       NEXP = IDINT(STKR(L2))              
  3706.       IF (STKR(L2) .NE. DFLOAT(NEXP)) GO TO 39               
  3707.       IF (STKI(L2) .NE. 0.0D0) GO TO 39   
  3708.       IF (NEXP .LT. 2) GO TO 39           
  3709.       MN = M*N         
  3710.       ERR = L2+MN+N - LSTK(BOT)           
  3711.       IF (ERR .GT. 0) CALL ERROR(17)      
  3712.       IF (ERR .GT. 0) RETURN              
  3713.       CALL WCOPY(MN,STKR(L),STKI(L),1,STKR(L2),STKI(L2),1)   
  3714.       L3 = L2+MN       
  3715.       DO 36 KEXP = 2, NEXP                
  3716.         DO 35 J = 1, N                    
  3717.           LS = L+(J-1)*N                  
  3718.           CALL WCOPY(N,STKR(LS),STKI(LS),1,STKR(L3),STKI(L3),1)                 
  3719.           DO 34 I = 1, N                  
  3720.             LS = L2+I-1                   
  3721.             LL = L+I-1+(J-1)*N            
  3722.             STKR(LL) = WDOTUR(N,STKR(LS),STKI(LS),N,STKR(L3),STKI(L3),1)        
  3723.             STKI(LL) = WDOTUI(N,STKR(LS),STKI(LS),N,STKR(L3),STKI(L3),1)        
  3724.    34     CONTINUE     
  3725.    35   CONTINUE       
  3726.    36 CONTINUE         
  3727.       GO TO 99         
  3728. C                      
  3729. C     NONINTEGER OR NONPOSITIVE POWER, USE EIGENVECTORS      
  3730.    39 FUN = 2          
  3731.       FIN = 0          
  3732.       GO TO 99         
  3733. C                      
  3734. C     ADD OR SUBTRACT SCALAR              
  3735.    50 IF (M2 .NE. N2) CALL ERROR(8)       
  3736.       IF (ERR .GT. 0) RETURN              
  3737.       M = M2           
  3738.       N = N2           
  3739.       MSTK(TOP) = M    
  3740.       NSTK(TOP) = N    
  3741.       SR = STKR(L)     
  3742.       SI = STKI(L)     
  3743.       CALL WCOPY(M*N,STKR(L+1),STKI(L+1),1,STKR(L),STKI(L),1)                   
  3744.       GO TO 58         
  3745.    52 IF (M .NE. N) CALL ERROR(8)         
  3746.       IF (ERR .GT. 0) RETURN              
  3747.       SR = STKR(L2)    
  3748.       SI = STKI(L2)    
  3749.       GO TO 58         
  3750.    54 IF (M2 .NE. N2) CALL ERROR(9)       
  3751.       IF (ERR .GT. 0) RETURN              
  3752.       M = M2           
  3753.       N = N2           
  3754.       MSTK(TOP) = M    
  3755.       NSTK(TOP) = N    
  3756.       SR = STKR(L)     
  3757.       SI = STKI(L)     
  3758.       CALL WCOPY(M*N,STKR(L+1),STKI(L+1),1,STKR(L),STKI(L),1)                   
  3759.       CALL WRSCAL(M*N,-1.0D0,STKR(L),STKI(L),1)              
  3760.       GO TO 58         
  3761.    56 IF (M .NE. N) CALL ERROR(9)         
  3762.       IF (ERR .GT. 0) RETURN              
  3763.       SR = -STKR(L2)   
  3764.       SI = -STKI(L2)   
  3765.       GO TO 58         
  3766.    58 DO 59 I = 1, N   
  3767.          LL = L + (I-1)*(N+1)             
  3768.          STKR(LL) = FLOP(STKR(LL)+SR)     
  3769.          STKI(LL) = FLOP(STKI(LL)+SI)     
  3770.    59 CONTINUE         
  3771.       GO TO 99         
  3772. C                      
  3773. C     COLON            
  3774.    60 E2 = STKR(L2)    
  3775.       ST = 1.0D0       
  3776.       N = 0            
  3777.       IF (RHS .LT. 3) GO TO 61            
  3778.       ST = STKR(L)     
  3779.       TOP = TOP-1      
  3780.       L = LSTK(TOP)    
  3781.       IF (ST .EQ. 0.0D0) GO TO 63         
  3782.    61 E1 = STKR(L)     
  3783. C     CHECK FOR CLAUSE                    
  3784.       IF (RSTK(PT) .EQ. 3) GO TO 64       
  3785.       ERR = L + MAX0(3,IDINT((E2-E1)/ST)) - LSTK(BOT)        
  3786.       IF (ERR .GT. 0) CALL ERROR(17)      
  3787.       IF (ERR .GT. 0) RETURN              
  3788.    62 IF (ST .GT. 0.0D0 .AND. STKR(L) .GT. E2) GO TO 63      
  3789.       IF (ST .LT. 0.0D0 .AND. STKR(L) .LT. E2) GO TO 63      
  3790.         N = N+1        
  3791.         L = L+1        
  3792.         STKR(L) = E1 + DFLOAT(N)*ST       
  3793.         STKI(L) = 0.0D0                   
  3794.         GO TO 62       
  3795.    63 NSTK(TOP) = N    
  3796.       MSTK(TOP) = 1    
  3797.       IF (N .EQ. 0) MSTK(TOP) = 0         
  3798.       GO TO 99         
  3799. C                      
  3800. C     FOR CLAUSE       
  3801.    64 STKR(L) = E1     
  3802.       STKR(L+1) = ST   
  3803.       STKR(L+2) = E2   
  3804.       MSTK(TOP) = -3   
  3805.       NSTK(TOP) = -1   
  3806.       GO TO 99         
  3807. C                      
  3808. C     ELEMENTWISE OPERATIONS              
  3809.    70 OP = OP - DOT    
  3810.       IF (M.NE.M2 .OR. N.NE.N2) CALL ERROR(10)               
  3811.       IF (ERR .GT. 0) RETURN              
  3812.       MN = M*N         
  3813.       DO 72 I = 1, MN                     
  3814.          J = L+I-1     
  3815.          K = L2+I-1    
  3816.          IF (OP .EQ. STAR)                
  3817.      $      CALL WMUL(STKR(J),STKI(J),STKR(K),STKI(K),STKR(J),STKI(J))          
  3818.          IF (OP .EQ. SLASH)               
  3819.      $      CALL WDIV(STKR(J),STKI(J),STKR(K),STKI(K),STKR(J),STKI(J))          
  3820.          IF (OP .EQ. BSLASH)              
  3821.      $      CALL WDIV(STKR(K),STKI(K),STKR(J),STKI(J),STKR(J),STKI(J))          
  3822.          IF (ERR .GT. 0) RETURN           
  3823.    72 CONTINUE         
  3824.       GO TO 99         
  3825. C                      
  3826. C     KRONECKER        
  3827.    80 FIN = OP - 2*DOT - STAR + 11        
  3828.       FUN = 6          
  3829.       TOP = TOP + 1    
  3830.       RHS = 2          
  3831.       GO TO 99         
  3832. C                      
  3833.    99 RETURN           
  3834.       END
  3835.               
  3836.       SUBROUTINE STACKG(ID)               
  3837.       INTEGER ID(4)    
  3838. C                      
  3839. C     GET VARIABLES FROM STORAGE          
  3840. C                      
  3841.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  3842.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  3843.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  3844.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  3845.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  3846.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  3847.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  3848.       LOGICAL EQID     
  3849.       IF (DDT .EQ. 1) WRITE(WTE,100) ID   
  3850.   100 FORMAT(1X,'STACKG',4I4)             
  3851.       CALL PUTID(IDSTK(1,BOT-1), ID)      
  3852.       K = LSIZE+1      
  3853.    10 K = K-1          
  3854.       IF (.NOT.EQID(IDSTK(1,K), ID)) GO TO 10                
  3855.       IF (K .GE. LSIZE-1 .AND. RHS .GT. 0) GO TO 98          
  3856.       IF (K .EQ. BOT-1) GO TO 98          
  3857.       LK = LSTK(K)     
  3858.       IF (RHS .EQ. 1) GO TO 40            
  3859.       IF (RHS .EQ. 2) GO TO 60            
  3860.       IF (RHS .GT. 2) CALL ERROR(21)      
  3861.       IF (ERR .GT. 0) RETURN              
  3862.       L = 1            
  3863.       IF (TOP .GT. 0) L = LSTK(TOP) + MSTK(TOP)*NSTK(TOP)    
  3864.       IF (TOP+1 .GE. BOT) CALL ERROR(18)  
  3865.       IF (ERR .GT. 0) RETURN              
  3866.       TOP = TOP+1      
  3867. C                      
  3868. C     LOAD VARIABLE TO TOP OF STACK       
  3869.       LSTK(TOP) = L    
  3870.       MSTK(TOP) = MSTK(K)                 
  3871.       NSTK(TOP) = NSTK(K)                 
  3872.       MN = MSTK(K)*NSTK(K)                
  3873.       ERR = L+MN - LSTK(BOT)              
  3874.       IF (ERR .GT. 0) CALL ERROR(17)      
  3875.       IF (ERR .GT. 0) RETURN              
  3876. C     IF RAND, MATFN6 GENERATES RANDOM NUMBER                
  3877.       IF (K .EQ. LSIZE) GO TO 97          
  3878.       CALL WCOPY(MN,STKR(LK),STKI(LK),1,STKR(L),STKI(L),1)   
  3879.       GO TO 99         
  3880. C                      
  3881. C     VECT(ARG)        
  3882.    40 IF (MSTK(TOP) .EQ. 0) GO TO 99      
  3883.       L = LSTK(TOP)    
  3884.       MN = MSTK(TOP)*NSTK(TOP)            
  3885.       MNK = MSTK(K)*NSTK(K)               
  3886.       IF (MSTK(TOP) .LT. 0) MN = MNK      
  3887.       DO 50 I = 1, MN                     
  3888.         LL = L+I-1     
  3889.         LS = LK+I-1    
  3890.         IF (MSTK(TOP) .GT. 0) LS = LK + IDINT(STKR(LL)) - 1  
  3891.         IF (LS .LT. LK .OR. LS .GE. LK+MNK) CALL ERROR(21)   
  3892.         IF (ERR .GT. 0) RETURN            
  3893.         STKR(LL) = STKR(LS)               
  3894.         STKI(LL) = STKI(LS)               
  3895.    50 CONTINUE         
  3896.       MSTK(TOP) = 1    
  3897.       NSTK(TOP) = 1    
  3898.       IF (MSTK(K) .GT. 1) MSTK(TOP) = MN  
  3899.       IF (MSTK(K) .EQ. 1) NSTK(TOP) = MN  
  3900.       GO TO 99         
  3901. C                      
  3902. C     MATRIX(ARG,ARG)                     
  3903.    60 TOP = TOP-1      
  3904.       L = LSTK(TOP)    
  3905.       IF (MSTK(TOP+1) .EQ. 0) MSTK(TOP) = 0                  
  3906.       IF (MSTK(TOP) .EQ. 0) GO TO 99      
  3907.       L2 = LSTK(TOP+1)                    
  3908.       M = MSTK(TOP)*NSTK(TOP)             
  3909.       IF (MSTK(TOP) .LT. 0) M = MSTK(K)   
  3910.       N = MSTK(TOP+1)*NSTK(TOP+1)         
  3911.       IF (MSTK(TOP+1) .LT. 0) N = NSTK(K)                    
  3912.       L3 = L2 + N      
  3913.       MK = MSTK(K)     
  3914.       MNK = MSTK(K)*NSTK(K)               
  3915.       DO 70 J = 1, N   
  3916.       DO 70 I = 1, M   
  3917.         LI = L+I-1     
  3918.         IF (MSTK(TOP) .GT. 0) LI = L + IDINT(STKR(LI)) - 1   
  3919.         LJ = L2+J-1    
  3920.         IF (MSTK(TOP+1) .GT. 0) LJ = L2 + IDINT(STKR(LJ)) - 1                   
  3921.         LS = LK + LI-L + (LJ-L2)*MK       
  3922.         IF (LS.LT.LK .OR. LS.GE.LK+MNK) CALL ERROR(21)       
  3923.         IF (ERR .GT. 0) RETURN            
  3924.         LL = L3 + I-1 + (J-1)*M           
  3925.         STKR(LL) = STKR(LS)               
  3926.         STKI(LL) = STKI(LS)               
  3927.    70 CONTINUE         
  3928.       MN = M*N         
  3929.       CALL WCOPY(MN,STKR(L3),STKI(L3),1,STKR(L),STKI(L),1)   
  3930.       MSTK(TOP) = M    
  3931.       NSTK(TOP) = N    
  3932.       GO TO 99         
  3933.    97 FIN = 7          
  3934.       FUN = 6          
  3935.       RETURN           
  3936.    98 FIN = 0          
  3937.       RETURN           
  3938.    99 FIN = -1         
  3939.       FUN = 0          
  3940.       RETURN           
  3941.       END
  3942.               
  3943.       SUBROUTINE STACKP(ID)               
  3944.       INTEGER ID(4)    
  3945. C                      
  3946. C     PUT VARIABLES INTO STORAGE          
  3947. C                      
  3948.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  3949.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  3950.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  3951.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  3952.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  3953.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  3954.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  3955.       LOGICAL EQID     
  3956.       INTEGER SEMI     
  3957.       DATA SEMI/39/    
  3958.       IF (DDT .EQ. 1) WRITE(WTE,100) ID   
  3959.   100 FORMAT(1X,'STACKP',4I4)             
  3960.       IF (TOP .LE. 0) CALL ERROR(1)       
  3961.       IF (ERR .GT. 0) RETURN              
  3962.       CALL FUNS(ID)    
  3963.       IF (FIN .NE. 0) CALL ERROR(25)      
  3964.       IF (ERR .GT. 0) RETURN              
  3965.       M = MSTK(TOP)    
  3966.       N = NSTK(TOP)    
  3967.       IF (M .GT. 0) L = LSTK(TOP)         
  3968.       IF (M .LT. 0) CALL ERROR(14)        
  3969.       IF (ERR .GT. 0) RETURN              
  3970.       IF (M .EQ. 0 .AND. N .NE. 0) GO TO 99                  
  3971.       MN = M*N         
  3972.       LK = 0           
  3973.       MK = 1           
  3974.       NK = 0           
  3975.       LT = 0           
  3976.       MT = 0           
  3977.       NT = 0           
  3978. C                      
  3979. C     DOES VARIABLE ALREADY EXIST         
  3980.       CALL PUTID(IDSTK(1,BOT-1),ID)       
  3981.       K = LSIZE+1      
  3982.    05 K = K-1          
  3983.       IF (.NOT.EQID(IDSTK(1,K),ID)) GO TO 05                 
  3984.       IF (K .EQ. BOT-1) GO TO 30          
  3985.       LK = LSTK(K)     
  3986.       MK = MSTK(K)     
  3987.       NK = NSTK(K)     
  3988.       MNK = MK*NK      
  3989.       IF (RHS .EQ. 0) GO TO 20            
  3990.       IF (RHS .GT. 2) CALL ERROR(15)      
  3991.       IF (ERR .GT. 0) RETURN              
  3992.       MT = MK          
  3993.       NT = NK          
  3994.       LT = L + MN      
  3995.       ERR = LT + MNK - LSTK(BOT)          
  3996.       IF (ERR .GT. 0) CALL ERROR(17)      
  3997.       IF (ERR .GT. 0) RETURN              
  3998.       CALL WCOPY(MNK,STKR(LK),STKI(LK),1,STKR(LT),STKI(LT),1)                   
  3999. C                      
  4000. C     DOES IT FIT      
  4001.    20 IF (RHS.EQ.0 .AND. MN.EQ.MNK) GO TO 40                 
  4002.       IF (K .GE. LSIZE-3) CALL ERROR(13)  
  4003.       IF (ERR .GT. 0) RETURN              
  4004. C                      
  4005. C     SHIFT STORAGE    
  4006.       IF (K .EQ. BOT) GO TO 25            
  4007.       LS = LSTK(BOT)   
  4008.       LL = LS + MNK    
  4009.       CALL WCOPY(LK-LS,STKR(LS),STKI(LS),-1,STKR(LL),STKI(LL),-1)               
  4010.       KM1 = K-1        
  4011.       DO 24 IB = BOT, KM1                 
  4012.         I = BOT+KM1-IB                    
  4013.         CALL PUTID(IDSTK(1,I+1),IDSTK(1,I))                  
  4014.         MSTK(I+1) = MSTK(I)               
  4015.         NSTK(I+1) = NSTK(I)               
  4016.         LSTK(I+1) = LSTK(I)+MNK           
  4017.    24 CONTINUE         
  4018. C                      
  4019. C     DESTROY OLD VARIABLE                
  4020.    25 BOT = BOT+1      
  4021. C                      
  4022. C     CREATE NEW VARIABLE                 
  4023.    30 IF (MN .EQ. 0) GO TO 99             
  4024.       IF (BOT-2 .LE. TOP) CALL ERROR(18)  
  4025.       IF (ERR .GT. 0) RETURN              
  4026.       K = BOT-1        
  4027.       CALL PUTID(IDSTK(1,K), ID)          
  4028.       IF (RHS .EQ. 1) GO TO 50            
  4029.       IF (RHS .EQ. 2) GO TO 55            
  4030. C                      
  4031. C     STORE            
  4032.    40 IF (K .LT. LSIZE) LSTK(K) = LSTK(K+1) - MN             
  4033.       MSTK(K) = M      
  4034.       NSTK(K) = N      
  4035.       LK = LSTK(K)     
  4036.       CALL WCOPY(MN,STKR(L),STKI(L),-1,STKR(LK),STKI(LK),-1) 
  4037.       GO TO 90         
  4038. C                      
  4039. C     VECT(ARG)        
  4040.    50 IF (MSTK(TOP-1) .LT. 0) GO TO 59    
  4041.       MN1 = 1          
  4042.       MN2 = 1          
  4043.       L1 = 0           
  4044.       L2 = 0           
  4045.       IF (N.NE.1 .OR. NK.NE.1) GO TO 52   
  4046.       L1 = LSTK(TOP-1)                    
  4047.       M1 = MSTK(TOP-1)                    
  4048.       MN1 = M1*NSTK(TOP-1)                
  4049.       M2 = -1          
  4050.       GO TO 60         
  4051.    52 IF (M.NE.1 .OR. MK.NE.1) CALL ERROR(15)                
  4052.       IF (ERR .GT. 0) RETURN              
  4053.       L2 = LSTK(TOP-1)                    
  4054.       M2 = MSTK(TOP-1)                    
  4055.       MN2 = M2*NSTK(TOP-1)                
  4056.       M1 = -1          
  4057.       GO TO 60         
  4058. C                      
  4059. C     MATRIX(ARG,ARG)                     
  4060.    55 IF (MSTK(TOP-1).LT.0 .AND. MSTK(TOP-2).LT.0) GO TO 59  
  4061.       L2 = LSTK(TOP-1)                    
  4062.       M2 = MSTK(TOP-1)                    
  4063.       MN2 = M2*NSTK(TOP-1)                
  4064.       IF (M2 .LT. 0) MN2 = N              
  4065.       L1 = LSTK(TOP-2)                    
  4066.       M1 = MSTK(TOP-2)                    
  4067.       MN1 = M1*NSTK(TOP-2)                
  4068.       IF (M1 .LT. 0) MN1 = M              
  4069.       GO TO 60         
  4070. C                      
  4071.    59 IF (MN .NE. MNK) CALL ERROR(15)     
  4072.       IF (ERR .GT. 0) RETURN              
  4073.       LK = LSTK(K)     
  4074.       CALL WCOPY(MN,STKR(L),STKI(L),-1,STKR(LK),STKI(LK),-1) 
  4075.       GO TO 90         
  4076. C                      
  4077.    60 IF (MN1.NE.M .OR. MN2.NE.N) CALL ERROR(15)             
  4078.       IF (ERR .GT. 0) RETURN              
  4079.       LL = 1           
  4080.       IF (M1 .LT. 0) GO TO 62             
  4081.       DO 61 I = 1, MN1                    
  4082.          LS = L1+I-1   
  4083.          MK = MAX0(MK,IDINT(STKR(LS)))    
  4084.          LL = MIN0(LL,IDINT(STKR(LS)))    
  4085.    61 CONTINUE         
  4086.    62 MK = MAX0(MK,M)                     
  4087.       IF (M2 .LT. 0) GO TO 64             
  4088.       DO 63 I = 1, MN2                    
  4089.          LS = L2+I-1   
  4090.          NK = MAX0(NK,IDINT(STKR(LS)))    
  4091.          LL = MIN0(LL,IDINT(STKR(LS)))    
  4092.    63 CONTINUE         
  4093.    64 NK = MAX0(NK,N)                     
  4094.       IF (LL .LT. 1) CALL ERROR(21)       
  4095.       IF (ERR .GT. 0) RETURN              
  4096.       MNK = MK*NK      
  4097.       LK = LSTK(K+1) - MNK                
  4098.       ERR = LT + MT*NT - LK               
  4099.       IF (ERR .GT. 0) CALL ERROR(17)      
  4100.       IF (ERR .GT. 0) RETURN              
  4101.       LSTK(K) = LK     
  4102.       MSTK(K) = MK     
  4103.       NSTK(K) = NK     
  4104.       CALL WSET(MNK,0.0D0,0.0D0,STKR(LK),STKI(LK),1)         
  4105.       IF (NT .LT. 1) GO TO 67             
  4106.       DO 66 J = 1, NT                     
  4107.          LS = LT+(J-1)*MT                 
  4108.          LL = LK+(J-1)*MK                 
  4109.          CALL WCOPY(MT,STKR(LS),STKI(LS),-1,STKR(LL),STKI(LL),-1)               
  4110.    66 CONTINUE         
  4111.    67 DO 68 J = 1, N   
  4112.       DO 68 I = 1, M   
  4113.         LI = L1+I-1    
  4114.         IF (M1 .GT. 0) LI = L1 + IDINT(STKR(LI)) - 1         
  4115.         LJ = L2+J-1    
  4116.         IF (M2 .GT. 0) LJ = L2 + IDINT(STKR(LJ)) - 1         
  4117.         LL = LK+LI-L1+(LJ-L2)*MK          
  4118.         LS = L+I-1+(J-1)*M                
  4119.         STKR(LL) = STKR(LS)               
  4120.         STKI(LL) = STKI(LS)               
  4121.    68 CONTINUE         
  4122.       GO TO 90         
  4123. C                      
  4124. C     PRINT IF DESIRED AND POP STACK      
  4125.    90 IF (SYM.NE.SEMI .AND. LCT(3).EQ.0) CALL PRINT(ID,K)    
  4126.       IF (SYM.EQ.SEMI .AND. LCT(3).EQ.1) CALL PRINT(ID,K)    
  4127.       IF (K .EQ. BOT-1) BOT = BOT-1       
  4128.    99 IF (M .NE. 0) TOP = TOP - 1 - RHS   
  4129.       IF (M .EQ. 0) TOP = TOP - 1         
  4130.       RETURN           
  4131.       END
  4132.               
  4133.       SUBROUTINE TERM                     
  4134.       DOUBLE PRECISION STKR(5005),STKI(5005)                 
  4135.       INTEGER IDSTK(4,48),LSTK(48),MSTK(48),NSTK(48),VSIZE,LSIZE,BOT,TOP        
  4136.       INTEGER IDS(4,32),PSTK(32),RSTK(32),PSIZE,PT,PTZ       
  4137.       INTEGER DDT,ERR,FMT,LCT(4),LIN(1024),LPT(6),HIO,RIO,WIO,RTE,WTE,FE           
  4138.       INTEGER SYM,SYN(4),BUF(256),CHAR,FLP(2),FIN,FUN,LHS,RHS,RAN(2)            
  4139.       COMMON /VSTK/ STKR,STKI,IDSTK,LSTK,MSTK,NSTK,VSIZE,LSIZE,BOT,TOP          
  4140.       COMMON /RECU/ IDS,PSTK,RSTK,PSIZE,PT,PTZ               
  4141.       COMMON /IOP/ DDT,ERR,FMT,LCT,LIN,LPT,HIO,RIO,WIO,RTE,WTE,FE                  
  4142.       COMMON /COM/ SYM,SYN,BUF,CHAR,FLP,FIN,FUN,LHS,RHS,RAN  
  4143.       INTEGER R,OP,BSLASH,STAR,SLASH,DOT  
  4144.       DATA BSLASH/45/,STAR/43/,SLASH/44/,DOT/47/             
  4145.       IF (DDT .EQ. 1) WRITE(WTE,100) PT,RSTK(PT)             
  4146.   100 FORMAT(1X,'TERM  ',2I4)             
  4147.       R = RSTK(PT)     
  4148.       GO TO (99,99,99,99,99,01,01,05,25,99,99,99,99,99,35,99,99,99,99),R        
  4149.    01 PT = PT+1        
  4150.       RSTK(PT) = 8     
  4151. C     *CALL* FACTOR    
  4152.       RETURN           
  4153.    05 PT = PT-1        
  4154.    10 OP = 0           
  4155.       IF (SYM .EQ. DOT) OP = DOT          
  4156.       IF (SYM .EQ. DOT) CALL GETSYM       
  4157.       IF (SYM.EQ.STAR .OR. SYM.EQ.SLASH .OR. SYM.EQ.BSLASH) GO TO 20            
  4158.       RETURN           
  4159.    20 OP = OP + SYM    
  4160.       CALL GETSYM      
  4161.       IF (SYM .EQ. DOT) OP = OP + SYM     
  4162.       IF (SYM .EQ. DOT) CALL GETSYM       
  4163.       PT = PT+1        
  4164.       PSTK(PT) = OP    
  4165.       RSTK(PT) = 9     
  4166. C     *CALL* FACTOR    
  4167.       RETURN           
  4168.    25 OP = PSTK(PT)    
  4169.       PT = PT-1        
  4170.       CALL STACK2(OP)                     
  4171.       IF (ERR .GT. 0) RETURN              
  4172. C     SOME BINARY OPS DONE IN MATFNS      
  4173.       IF (FUN .EQ. 0) GO TO 10            
  4174.       PT = PT+1        
  4175.       RSTK(PT) = 15    
  4176. C     *CALL* MATFN     
  4177.       RETURN           
  4178.    35 PT = PT-1        
  4179.       GO TO 10         
  4180.    99 CALL ERROR(22)   
  4181.       IF (ERR .GT. 0) RETURN              
  4182.       RETURN           
  4183.       END
  4184.               
  4185.       SUBROUTINE USER(A,M,N,S,T)          
  4186.       DOUBLE PRECISION A(M,N),S,T         
  4187. C                      
  4188.       INTEGER A3(9)    
  4189.       DATA A3 /-149,537,-27,-50,180,-9,-154,546,-25/         
  4190.       IF (A(1,1) .NE. 3.0D0) RETURN       
  4191.       DO 10 I = 1, 9   
  4192.          A(I,1) = DFLOAT(A3(I))           
  4193.    10 CONTINUE         
  4194.       M = 3            
  4195.       N = 3            
  4196.       RETURN           
  4197.       END 
  4198.               
  4199.       SUBROUTINE XCHAR(BUF,K)             
  4200.       INTEGER BUF(1),K                    
  4201. C                      
  4202. C     SYSTEM DEPENDENT ROUTINE TO HANDLE SPECIAL CHARACTERS  
  4203. C                      
  4204. C                      
  4205.       INTEGER BACK,MASK                   
  4206.       DATA BACK/Z'20202008'/,MASK/Z'000000FF'/               
  4207. C                      
  4208.       IF (BUF(1) .EQ. BACK) K = -1        
  4209.       L = BUF(1) .AND. MASK               
  4210.       IF (K .NE. -1) WRITE(6,10) BUF(1),L                    
  4211.    10 FORMAT(1X,1H',A1,4H' = ,Z2,' hex is not a MATLAB character.')             
  4212.       RETURN           
  4213.       END
  4214.       SUBROUTINE WGECO(AR,AI,LDA,N,IPVT,RCOND,ZR,ZI)         
  4215.       INTEGER LDA,N,IPVT(1)               
  4216.       DOUBLE PRECISION AR(LDA,1),AI(LDA,1),ZR(1),ZI(1)       
  4217.       DOUBLE PRECISION RCOND              
  4218. C                      
  4219. C     WGECO FACTORS A DOUBLE-COMPLEX MATRIX BY GAUSSIAN ELIMINATION             
  4220. C     AND ESTIMATES THE CONDITION OF THE MATRIX.             
  4221. C                      
  4222. C     IF  RCOND  IS NOT NEEDED, WGEFA IS SLIGHTLY FASTER.    
  4223. C     TO SOLVE  A*X = B , FOLLOW WGECO BY WGESL.             
  4224. C     TO COMPUTE  INVERSE(A)*C , FOLLOW WGECO BY WGESL.      
  4225. C     TO COMPUTE  DETERMINANT(A) , FOLLOW WGECO BY WGEDI.    
  4226. C     TO COMPUTE  INVERSE(A) , FOLLOW WGECO BY WGEDI.        
  4227. C                      
  4228. C     ON ENTRY         
  4229. C                      
  4230. C        A       DOUBLE-COMPLEX(LDA, N)   
  4231. C                THE MATRIX TO BE FACTORED.                  
  4232. C                      
  4233. C        LDA     INTEGER                  
  4234. C                THE LEADING DIMENSION OF THE ARRAY  A .     
  4235. C                      
  4236. C        N       INTEGER                  
  4237. C                THE ORDER OF THE MATRIX  A .                
  4238. C                      
  4239. C     ON RETURN        
  4240. C                      
  4241. C        A       AN UPPER TRIANGULAR MATRIX AND THE MULTIPLIERS                 
  4242. C                WHICH WERE USED TO OBTAIN IT.               
  4243. C                THE FACTORIZATION CAN BE WRITTEN  A = L*U  WHERE               
  4244. C                L  IS A PRODUCT OF PERMUTATION AND UNIT LOWER                  
  4245. C                TRIANGULAR MATRICES AND  U  IS UPPER TRIANGULAR.               
  4246. C                      
  4247. C        IPVT    INTEGER(N)               
  4248. C                AN INTEGER VECTOR OF PIVOT INDICES.         
  4249. C                      
  4250. C        RCOND   DOUBLE PRECISION         
  4251. C                AN ESTIMATE OF THE RECIPROCAL CONDITION OF  A .                
  4252. C                FOR THE SYSTEM  A*X = B , RELATIVE PERTURBATIONS               
  4253. C                IN  A  AND  B  OF SIZE  EPSILON  MAY CAUSE  
  4254. C                RELATIVE PERTURBATIONS IN  X  OF SIZE  EPSILON/RCOND .         
  4255. C                IF  RCOND  IS SO SMALL THAT THE LOGICAL EXPRESSION             
  4256. C        1.0 + RCOND .EQ. 1.0             
  4257. C                IS TRUE, THEN  A  MAY BE SINGULAR TO WORKING                   
  4258. C                PRECISION.  IN PARTICULAR,  RCOND  IS ZERO  IF                 
  4259. C                EXACT SINGULARITY IS DETECTED OR THE ESTIMATE                  
  4260. C                UNDERFLOWS.              
  4261. C                      
  4262. C        Z       DOUBLE-COMPLEX(N)        
  4263. C                A WORK VECTOR WHOSE CONTENTS ARE USUALLY UNIMPORTANT.          
  4264. C                IF  A  IS CLOSE TO A SINGULAR MATRIX, THEN  Z  IS              
  4265. C                AN APPROXIMATE NULL VECTOR IN THE SENSE THAT                   
  4266. C                NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .         
  4267. C                      
  4268. C     LINPACK. THIS VERSION DATED 07/01/79 .                 
  4269. C     CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.              
  4270. C                      
  4271. C     SUBROUTINES AND FUNCTIONS           
  4272. C                      
  4273. C     LINPACK WGEFA    
  4274. C     BLAS WAXPY,WDOTC,WASUM              
  4275. C     FORTRAN DABS,DMAX1                  
  4276. C                      
  4277. C     INTERNAL VARIABLES                  
  4278. C                      
  4279.       DOUBLE PRECISION WDOTCR,WDOTCI,EKR,EKI,TR,TI,WKR,WKI,WKMR,WKMI            
  4280.       DOUBLE PRECISION ANORM,S,WASUM,SM,YNORM,FLOP           
  4281.       INTEGER INFO,J,K,KB,KP1,L           
  4282. C                      
  4283.       DOUBLE PRECISION ZDUMR,ZDUMI        
  4284.       DOUBLE PRECISION CABS1              
  4285.       CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI)         
  4286. C                      
  4287. C     COMPUTE 1-NORM OF A                 
  4288. C                      
  4289.       ANORM = 0.0D0    
  4290.       DO 10 J = 1, N   
  4291.          ANORM = DMAX1(ANORM,WASUM(N,AR(1,J),AI(1,J),1))     
  4292.    10 CONTINUE         
  4293. C                      
  4294. C     FACTOR           
  4295. C                      
  4296.       CALL WGEFA(AR,AI,LDA,N,IPVT,INFO)   
  4297. C                      
  4298. C     RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .   
  4299. C     ESTIMATE = NORM(Z)/NORM(Y) WHERE  A*Z = Y  AND  CTRANS(A)*Y = E .         
  4300. C     CTRANS(A)  IS THE CONJUGATE TRANSPOSE OF A .           
  4301. C     THE COMPONENTS OF  E  ARE CHOSEN TO CAUSE MAXIMUM LOCAL                   
  4302. C     GROWTH IN THE ELEMENTS OF W  WHERE  CTRANS(U)*W = E .  
  4303. C     THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW. 
  4304. C                      
  4305. C     SOLVE CTRANS(U)*W = E               
  4306. C                      
  4307.       EKR = 1.0D0      
  4308.       EKI = 0.0D0      
  4309.       DO 20 J = 1, N   
  4310.          ZR(J) = 0.0D0                    
  4311.          ZI(J) = 0.0D0                    
  4312.    20 CONTINUE         
  4313.       DO 110 K = 1, N                     
  4314.          CALL WSIGN(EKR,EKI,-ZR(K),-ZI(K),EKR,EKI)           
  4315.          IF (CABS1(EKR-ZR(K),EKI-ZI(K))   
  4316.      *       .LE. CABS1(AR(K,K),AI(K,K))) GO TO 40           
  4317.             S = CABS1(AR(K,K),AI(K,K))    
  4318.      *          /CABS1(EKR-ZR(K),EKI-ZI(K))                  
  4319.             CALL WRSCAL(N,S,ZR,ZI,1)      
  4320.             EKR = S*EKR                   
  4321.             EKI = S*EKI                   
  4322.    40    CONTINUE      
  4323.          WKR = EKR - ZR(K)                
  4324.          WKI = EKI - ZI(K)                
  4325.          WKMR = -EKR - ZR(K)              
  4326.          WKMI = -EKI - ZI(K)              
  4327.          S = CABS1(WKR,WKI)               
  4328.          SM = CABS1(WKMR,WKMI)            
  4329.          IF (CABS1(AR(K,K),AI(K,K)) .EQ. 0.0D0) GO TO 50     
  4330.             CALL WDIV(WKR,WKI,AR(K,K),-AI(K,K),WKR,WKI)      
  4331.             CALL WDIV(WKMR,WKMI,AR(K,K),-AI(K,K),WKMR,WKMI)  
  4332.          GO TO 60      
  4333.    50    CONTINUE      
  4334.             WKR = 1.0D0                   
  4335.             WKI = 0.0D0                   
  4336.             WKMR = 1.0D0                  
  4337.             WKMI = 0.0D0                  
  4338.    60    CONTINUE      
  4339.          KP1 = K + 1   
  4340.          IF (KP1 .GT. N) GO TO 100        
  4341.             DO 70 J = KP1, N              
  4342.                CALL WMUL(WKMR,WKMI,AR(K,J),-AI(K,J),TR,TI)   
  4343.                SM = FLOP(SM + CABS1(ZR(J)+TR,ZI(J)+TI))      
  4344.                CALL WAXPY(1,WKR,WKI,AR(K,J),-AI(K,J),1,      
  4345.      $ ZR(J),ZI(J),1)  
  4346.                S = FLOP(S + CABS1(ZR(J),ZI(J)))              
  4347.    70       CONTINUE   
  4348.             IF (S .GE. SM) GO TO 90       
  4349.                TR = WKMR - WKR            
  4350.                TI = WKMI - WKI            
  4351.                WKR = WKMR                 
  4352.                WKI = WKMI                 
  4353.                DO 80 J = KP1, N           
  4354.                   CALL WAXPY(1,TR,TI,AR(K,J),-AI(K,J),1,     
  4355.      $    ZR(J),ZI(J),1)                  
  4356.    80          CONTINUE                   
  4357.    90       CONTINUE   
  4358.   100    CONTINUE      
  4359.          ZR(K) = WKR   
  4360.          ZI(K) = WKI   
  4361.   110 CONTINUE         
  4362.       S = 1.0D0/WASUM(N,ZR,ZI,1)          
  4363.       CALL WRSCAL(N,S,ZR,ZI,1)            
  4364. C                      
  4365. C     SOLVE CTRANS(L)*Y = W               
  4366. C                      
  4367.       DO 140 KB = 1, N                    
  4368.          K = N + 1 - KB                   
  4369.          IF (K .GE. N) GO TO 120          
  4370.             ZR(K) = ZR(K)                 
  4371.      *            + WDOTCR(N-K,AR(K+1,K),AI(K+1,K),1,ZR(K+1),ZI(K+1),1)         
  4372.             ZI(K) = ZI(K)                 
  4373.      *            + WDOTCI(N-K,AR(K+1,K),AI(K+1,K),1,ZR(K+1),ZI(K+1),1)         
  4374.   120    CONTINUE      
  4375.          IF (CABS1(ZR(K),ZI(K)) .LE. 1.0D0) GO TO 130        
  4376.             S = 1.0D0/CABS1(ZR(K),ZI(K))  
  4377.             CALL WRSCAL(N,S,ZR,ZI,1)      
  4378.   130    CONTINUE      
  4379.          L = IPVT(K)   
  4380.          TR = ZR(L)    
  4381.          TI = ZI(L)    
  4382.          ZR(L) = ZR(K)                    
  4383.          ZI(L) = ZI(K)                    
  4384.          ZR(K) = TR    
  4385.          ZI(K) = TI    
  4386.   140 CONTINUE         
  4387.       S = 1.0D0/WASUM(N,ZR,ZI,1)          
  4388.       CALL WRSCAL(N,S,ZR,ZI,1)            
  4389. C                      
  4390.       YNORM = 1.0D0    
  4391. C                      
  4392. C     SOLVE L*V = Y    
  4393. C                      
  4394.       DO 160 K = 1, N                     
  4395.          L = IPVT(K)   
  4396.          TR = ZR(L)    
  4397.          TI = ZI(L)    
  4398.          ZR(L) = ZR(K)                    
  4399.          ZI(L) = ZI(K)                    
  4400.          ZR(K) = TR    
  4401.          ZI(K) = TI    
  4402.          IF (K .LT. N)                    
  4403.      *      CALL WAXPY(N-K,TR,TI,AR(K+1,K),AI(K+1,K),1,ZR(K+1),ZI(K+1),         
  4404.      *                 1)                 
  4405.          IF (CABS1(ZR(K),ZI(K)) .LE. 1.0D0) GO TO 150        
  4406.             S = 1.0D0/CABS1(ZR(K),ZI(K))  
  4407.             CALL WRSCAL(N,S,ZR,ZI,1)      
  4408.             YNORM = S*YNORM               
  4409.   150    CONTINUE      
  4410.   160 CONTINUE         
  4411.       S = 1.0D0/WASUM(N,ZR,ZI,1)          
  4412.       CALL WRSCAL(N,S,ZR,ZI,1)            
  4413.       YNORM = S*YNORM                     
  4414. C                      
  4415. C     SOLVE  U*Z = V   
  4416. C                      
  4417.       DO 200 KB = 1, N                    
  4418.          K = N + 1 - KB                   
  4419.          IF (CABS1(ZR(K),ZI(K))           
  4420.      *       .LE. CABS1(AR(K,K),AI(K,K))) GO TO 170          
  4421.             S = CABS1(AR(K,K),AI(K,K))    
  4422.      *          /CABS1(ZR(K),ZI(K))       
  4423.             CALL WRSCAL(N,S,ZR,ZI,1)      
  4424.             YNORM = S*YNORM               
  4425.   170    CONTINUE      
  4426.          IF (CABS1(AR(K,K),AI(K,K)) .EQ. 0.0D0) GO TO 180    
  4427.             CALL WDIV(ZR(K),ZI(K),AR(K,K),AI(K,K),ZR(K),ZI(K))                  
  4428.   180    CONTINUE      
  4429.          IF (CABS1(AR(K,K),AI(K,K)) .NE. 0.0D0) GO TO 190    
  4430.             ZR(K) = 1.0D0                 
  4431.             ZI(K) = 0.0D0                 
  4432.   190    CONTINUE      
  4433.          TR = -ZR(K)   
  4434.          TI = -ZI(K)   
  4435.          CALL WAXPY(K-1,TR,TI,AR(1,K),AI(1,K),1,ZR(1),ZI(1),1)                  
  4436.   200 CONTINUE         
  4437. C     MAKE ZNORM = 1.0                    
  4438.       S = 1.0D0/WASUM(N,ZR,ZI,1)          
  4439.       CALL WRSCAL(N,S,ZR,ZI,1)            
  4440.       YNORM = S*YNORM                     
  4441. C                      
  4442.       IF (ANORM .NE. 0.0D0) RCOND = YNORM/ANORM              
  4443.       IF (ANORM .EQ. 0.0D0) RCOND = 0.0D0                    
  4444.       RETURN           
  4445.       END              
  4446.       SUBROUTINE WGEFA(AR,AI,LDA,N,IPVT,INFO)                
  4447.       INTEGER LDA,N,IPVT(1),INFO          
  4448.       DOUBLE PRECISION AR(LDA,1),AI(LDA,1)                   
  4449. C                      
  4450. C     WGEFA FACTORS A DOUBLE-COMPLEX MATRIX BY GAUSSIAN ELIMINATION.            
  4451. C                      
  4452. C     WGEFA IS USUALLY CALLED BY WGECO, BUT IT CAN BE CALLED 
  4453. C     DIRECTLY WITH A SAVING IN TIME IF  RCOND  IS NOT NEEDED.                  
  4454. C     (TIME FOR WGECO) = (1 + 9/N)*(TIME FOR WGEFA) .        
  4455. C                      
  4456. C     ON ENTRY         
  4457. C                      
  4458. C        A       DOUBLE-COMPLEX(LDA, N)   
  4459. C                THE MATRIX TO BE FACTORED.                  
  4460. C                      
  4461. C        LDA     INTEGER                  
  4462. C                THE LEADING DIMENSION OF THE ARRAY  A .     
  4463. C                      
  4464. C        N       INTEGER                  
  4465. C                THE ORDER OF THE MATRIX  A .                
  4466. C                      
  4467. C     ON RETURN        
  4468. C                      
  4469. C        A       AN UPPER TRIANGULAR MATRIX AND THE MULTIPLIERS                 
  4470. C                WHICH WERE USED TO OBTAIN IT.               
  4471. C                THE FACTORIZATION CAN BE WRITTEN  A = L*U  WHERE               
  4472. C                L  IS A PRODUCT OF PERMUTATION AND UNIT LOWER                  
  4473. C                TRIANGULAR MATRICES AND  U  IS UPPER TRIANGULAR.               
  4474. C                      
  4475. C        IPVT    INTEGER(N)               
  4476. C                AN INTEGER VECTOR OF PIVOT INDICES.         
  4477. C                      
  4478. C        INFO    INTEGER                  
  4479. C                = 0  NORMAL VALUE.       
  4480. C                = K  IF  U(K,K) .EQ. 0.0 .  THIS IS NOT AN ERROR               
  4481. C  CONDITION FOR THIS SUBROUTINE, BUT IT DOES                
  4482. C  INDICATE THAT WGESL OR WGEDI WILL DIVIDE BY ZERO          
  4483. C  IF CALLED.  USE  RCOND  IN WGECO FOR A RELIABLE           
  4484. C  INDICATION OF SINGULARITY.             
  4485. C                      
  4486. C     LINPACK. THIS VERSION DATED 07/01/79 .                 
  4487. C     CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.              
  4488. C                      
  4489. C     SUBROUTINES AND FUNCTIONS           
  4490. C                      
  4491. C     BLAS WAXPY,WSCAL,IWAMAX             
  4492. C     FORTRAN DABS     
  4493. C                      
  4494. C     INTERNAL VARIABLES                  
  4495. C                      
  4496.       DOUBLE PRECISION TR,TI              
  4497.       INTEGER IWAMAX,J,K,KP1,L,NM1        
  4498. C                      
  4499.       DOUBLE PRECISION ZDUMR,ZDUMI        
  4500.       DOUBLE PRECISION CABS1              
  4501.       CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI)         
  4502. C                      
  4503. C     GAUSSIAN ELIMINATION WITH PARTIAL PIVOTING             
  4504. C                      
  4505.       INFO = 0         
  4506.       NM1 = N - 1      
  4507.       IF (NM1 .LT. 1) GO TO 70            
  4508.       DO 60 K = 1, NM1                    
  4509.          KP1 = K + 1   
  4510. C                      
  4511. C        FIND L = PIVOT INDEX             
  4512. C                      
  4513.          L = IWAMAX(N-K+1,AR(K,K),AI(K,K),1) + K - 1         
  4514.          IPVT(K) = L   
  4515. C                      
  4516. C        ZERO PIVOT IMPLIES THIS COLUMN ALREADY TRIANGULARIZED                  
  4517. C                      
  4518.          IF (CABS1(AR(L,K),AI(L,K)) .EQ. 0.0D0) GO TO 40     
  4519. C                      
  4520. C           INTERCHANGE IF NECESSARY      
  4521. C                      
  4522.             IF (L .EQ. K) GO TO 10        
  4523.                TR = AR(L,K)               
  4524.                TI = AI(L,K)               
  4525.                AR(L,K) = AR(K,K)          
  4526.                AI(L,K) = AI(K,K)          
  4527.                AR(K,K) = TR               
  4528.                AI(K,K) = TI               
  4529.    10       CONTINUE   
  4530. C                      
  4531. C           COMPUTE MULTIPLIERS           
  4532. C                      
  4533.             CALL WDIV(-1.0D0,0.0D0,AR(K,K),AI(K,K),TR,TI)    
  4534.             CALL WSCAL(N-K,TR,TI,AR(K+1,K),AI(K+1,K),1)      
  4535. C                      
  4536. C           ROW ELIMINATION WITH COLUMN INDEXING             
  4537. C                      
  4538.             DO 30 J = KP1, N              
  4539.                TR = AR(L,J)               
  4540.                TI = AI(L,J)               
  4541.                IF (L .EQ. K) GO TO 20     
  4542.                   AR(L,J) = AR(K,J)       
  4543.                   AI(L,J) = AI(K,J)       
  4544.                   AR(K,J) = TR            
  4545.                   AI(K,J) = TI            
  4546.    20          CONTINUE                   
  4547.                CALL WAXPY(N-K,TR,TI,AR(K+1,K),AI(K+1,K),1,AR(K+1,J),            
  4548.      * AI(K+1,J),1)    
  4549.    30       CONTINUE   
  4550.          GO TO 50      
  4551.    40    CONTINUE      
  4552.             INFO = K   
  4553.    50    CONTINUE      
  4554.    60 CONTINUE         
  4555.    70 CONTINUE         
  4556.       IPVT(N) = N      
  4557.       IF (CABS1(AR(N,N),AI(N,N)) .EQ. 0.0D0) INFO = N        
  4558.       RETURN           
  4559.       END              
  4560.       SUBROUTINE WGESL(AR,AI,LDA,N,IPVT,BR,BI,JOB)           
  4561.       INTEGER LDA,N,IPVT(1),JOB           
  4562.       DOUBLE PRECISION AR(LDA,1),AI(LDA,1),BR(1),BI(1)       
  4563. C                      
  4564. C     WGESL SOLVES THE DOUBLE-COMPLEX SYSTEM                 
  4565. C     A * X = B  OR  CTRANS(A) * X = B    
  4566. C     USING THE FACTORS COMPUTED BY WGECO OR WGEFA.          
  4567. C                      
  4568. C     ON ENTRY         
  4569. C                      
  4570. C        A       DOUBLE-COMPLEX(LDA, N)   
  4571. C                THE OUTPUT FROM WGECO OR WGEFA.             
  4572. C                      
  4573. C        LDA     INTEGER                  
  4574. C                THE LEADING DIMENSION OF THE ARRAY  A .     
  4575. C                      
  4576. C        N       INTEGER                  
  4577. C                THE ORDER OF THE MATRIX  A .                
  4578. C                      
  4579. C        IPVT    INTEGER(N)               
  4580. C                THE PIVOT VECTOR FROM WGECO OR WGEFA.       
  4581. C                      
  4582. C        B       DOUBLE-COMPLEX(N)        
  4583. C                THE RIGHT HAND SIDE VECTOR.                 
  4584. C                      
  4585. C        JOB     INTEGER                  
  4586. C                = 0         TO SOLVE  A*X = B ,             
  4587. C                = NONZERO   TO SOLVE  CTRANS(A)*X = B  WHERE                   
  4588. C         CTRANS(A)  IS THE CONJUGATE TRANSPOSE.             
  4589. C                      
  4590. C     ON RETURN        
  4591. C                      
  4592. C        B       THE SOLUTION VECTOR  X .                    
  4593. C                      
  4594. C     ERROR CONDITION                     
  4595. C                      
  4596. C        A DIVISION BY ZERO WILL OCCUR IF THE INPUT FACTOR CONTAINS A           
  4597. C        ZERO ON THE DIAGONAL.  TECHNICALLY THIS INDICATES SINGULARITY          
  4598. C        BUT IT IS OFTEN CAUSED BY IMPROPER ARGUMENTS OR IMPROPER               
  4599. C        SETTING OF LDA .  IT WILL NOT OCCUR IF THE SUBROUTINES ARE             
  4600. C        CALLED CORRECTLY AND IF WGECO HAS SET RCOND .GT. 0.0                   
  4601. C        OR WGEFA HAS SET INFO .EQ. 0 .   
  4602. C                      
  4603. C     TO COMPUTE  INVERSE(A) * C  WHERE  C  IS A MATRIX      
  4604. C     WITH  P  COLUMNS                    
  4605. C           CALL WGECO(A,LDA,N,IPVT,RCOND,Z)                 
  4606. C           IF (RCOND IS TOO SMALL) GO TO ...                
  4607. C           DO 10 J = 1, P                
  4608. C              CALL WGESL(A,LDA,N,IPVT,C(1,J),0)             
  4609. C        10 CONTINUE   
  4610. C                      
  4611. C     LINPACK. THIS VERSION DATED 07/01/79 .                 
  4612. C     CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.              
  4613. C                      
  4614. C     SUBROUTINES AND FUNCTIONS           
  4615. C                      
  4616. C     BLAS WAXPY,WDOTC                    
  4617. C                      
  4618. C     INTERNAL VARIABLES                  
  4619. C                      
  4620.       DOUBLE PRECISION WDOTCR,WDOTCI,TR,TI                   
  4621.       INTEGER K,KB,L,NM1                  
  4622. C                      
  4623.       NM1 = N - 1      
  4624.       IF (JOB .NE. 0) GO TO 50            
  4625. C                      
  4626. C        JOB = 0 , SOLVE  A * X = B       
  4627. C        FIRST SOLVE  L*Y = B             
  4628. C                      
  4629.          IF (NM1 .LT. 1) GO TO 30         
  4630.          DO 20 K = 1, NM1                 
  4631.             L = IPVT(K)                   
  4632.             TR = BR(L)                    
  4633.             TI = BI(L)                    
  4634.             IF (L .EQ. K) GO TO 10        
  4635.                BR(L) = BR(K)              
  4636.                BI(L) = BI(K)              
  4637.                BR(K) = TR                 
  4638.                BI(K) = TI                 
  4639.    10       CONTINUE   
  4640.             CALL WAXPY(N-K,TR,TI,AR(K+1,K),AI(K+1,K),1,BR(K+1),BI(K+1),         
  4641.      *                 1)                 
  4642.    20    CONTINUE      
  4643.    30    CONTINUE      
  4644. C                      
  4645. C        NOW SOLVE  U*X = Y               
  4646. C                      
  4647.          DO 40 KB = 1, N                  
  4648.             K = N + 1 - KB                
  4649.             CALL WDIV(BR(K),BI(K),AR(K,K),AI(K,K),BR(K),BI(K))                  
  4650.             TR = -BR(K)                   
  4651.             TI = -BI(K)                   
  4652.             CALL WAXPY(K-1,TR,TI,AR(1,K),AI(1,K),1,BR(1),BI(1),1)               
  4653.    40    CONTINUE      
  4654.       GO TO 100        
  4655.    50 CONTINUE         
  4656. C                      
  4657. C        JOB = NONZERO, SOLVE  CTRANS(A) * X = B             
  4658. C        FIRST SOLVE  CTRANS(U)*Y = B     
  4659. C                      
  4660.          DO 60 K = 1, N                   
  4661.             TR = BR(K) - WDOTCR(K-1,AR(1,K),AI(1,K),1,BR(1),BI(1),1)            
  4662.             TI = BI(K) - WDOTCI(K-1,AR(1,K),AI(1,K),1,BR(1),BI(1),1)            
  4663.             CALL WDIV(TR,TI,AR(K,K),-AI(K,K),BR(K),BI(K))    
  4664.    60    CONTINUE      
  4665. C                      
  4666. C        NOW SOLVE CTRANS(L)*X = Y        
  4667. C                      
  4668.          IF (NM1 .LT. 1) GO TO 90         
  4669.          DO 80 KB = 1, NM1                
  4670.             K = N - KB                    
  4671.             BR(K) = BR(K)                 
  4672.      *            + WDOTCR(N-K,AR(K+1,K),AI(K+1,K),1,BR(K+1),BI(K+1),1)         
  4673.             BI(K) = BI(K)                 
  4674.      *            + WDOTCI(N-K,AR(K+1,K),AI(K+1,K),1,BR(K+1),BI(K+1),1)         
  4675.             L = IPVT(K)                   
  4676.             IF (L .EQ. K) GO TO 70        
  4677.                TR = BR(L)                 
  4678.                TI = BI(L)                 
  4679.                BR(L) = BR(K)              
  4680.                BI(L) = BI(K)              
  4681.                BR(K) = TR                 
  4682.                BI(K) = TI                 
  4683.    70       CONTINUE   
  4684.    80    CONTINUE      
  4685.    90    CONTINUE      
  4686.   100 CONTINUE         
  4687.       RETURN           
  4688.       END              
  4689.       SUBROUTINE WGEDI(AR,AI,LDA,N,IPVT,DETR,DETI,WORKR,WORKI,JOB)              
  4690.       INTEGER LDA,N,IPVT(1),JOB           
  4691.       DOUBLE PRECISION AR(LDA,1),AI(LDA,1),DETR(2),DETI(2),WORKR(1),            
  4692.      *                 WORKI(1)           
  4693. C                      
  4694. C     WGEDI COMPUTES THE DETERMINANT AND INVERSE OF A MATRIX 
  4695. C     USING THE FACTORS COMPUTED BY WGECO OR WGEFA.          
  4696. C                      
  4697. C     ON ENTRY         
  4698. C                      
  4699. C        A       DOUBLE-COMPLEX(LDA, N)   
  4700. C                THE OUTPUT FROM WGECO OR WGEFA.             
  4701. C                      
  4702. C        LDA     INTEGER                  
  4703. C                THE LEADING DIMENSION OF THE ARRAY  A .     
  4704. C                      
  4705. C        N       INTEGER                  
  4706. C                THE ORDER OF THE MATRIX  A .                
  4707. C                      
  4708. C        IPVT    INTEGER(N)               
  4709. C                THE PIVOT VECTOR FROM WGECO OR WGEFA.       
  4710. C                      
  4711. C        WORK    DOUBLE-COMPLEX(N)        
  4712. C                WORK VECTOR.  CONTENTS DESTROYED.           
  4713. C                      
  4714. C        JOB     INTEGER                  
  4715. C                = 11   BOTH DETERMINANT AND INVERSE.        
  4716. C                = 01   INVERSE ONLY.     
  4717. C                = 10   DETERMINANT ONLY.                    
  4718. C                      
  4719. C     ON RETURN        
  4720. C                      
  4721. C        A       INVERSE OF ORIGINAL MATRIX IF REQUESTED.    
  4722. C                OTHERWISE UNCHANGED.     
  4723. C                      
  4724. C        DET     DOUBLE-COMPLEX(2)        
  4725. C                DETERMINANT OF ORIGINAL MATRIX IF REQUESTED.                   
  4726. C                OTHERWISE NOT REFERENCED.                   
  4727. C                DETERMINANT = DET(1) * 10.0**DET(2)         
  4728. C                WITH  1.0 .LE. CABS1(DET(1) .LT. 10.0       
  4729. C                OR  DET(1) .EQ. 0.0 .    
  4730. C                      
  4731. C     ERROR CONDITION                     
  4732. C                      
  4733. C        A DIVISION BY ZERO WILL OCCUR IF THE INPUT FACTOR CONTAINS             
  4734. C        A ZERO ON THE DIAGONAL AND THE INVERSE IS REQUESTED.                   
  4735. C        IT WILL NOT OCCUR IF THE SUBROUTINES ARE CALLED CORRECTLY              
  4736. C        AND IF WGECO HAS SET RCOND .GT. 0.0 OR WGEFA HAS SET                   
  4737. C        INFO .EQ. 0 .                    
  4738. C                      
  4739. C     LINPACK. THIS VERSION DATED 07/01/79 .                 
  4740. C     CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.              
  4741. C                      
  4742. C     SUBROUTINES AND FUNCTIONS           
  4743. C                      
  4744. C     BLAS WAXPY,WSCAL,WSWAP              
  4745. C     FORTRAN DABS,MOD                    
  4746. C                      
  4747. C     INTERNAL VARIABLES                  
  4748. C                      
  4749.       DOUBLE PRECISION TR,TI              
  4750.       DOUBLE PRECISION TEN                
  4751.       INTEGER I,J,K,KB,KP1,L,NM1          
  4752. C                      
  4753.       DOUBLE PRECISION ZDUMR,ZDUMI        
  4754.       DOUBLE PRECISION CABS1              
  4755.       CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI)         
  4756. C                      
  4757. C     COMPUTE DETERMINANT                 
  4758. C                      
  4759.       IF (JOB/10 .EQ. 0) GO TO 80         
  4760.          DETR(1) = 1.0D0                  
  4761.          DETI(1) = 0.0D0                  
  4762.          DETR(2) = 0.0D0                  
  4763.          DETI(2) = 0.0D0                  
  4764.          TEN = 10.0D0                     
  4765.          DO 60 I = 1, N                   
  4766.             IF (IPVT(I) .EQ. I) GO TO 10  
  4767.                DETR(1) = -DETR(1)         
  4768.                DETI(1) = -DETI(1)         
  4769.    10       CONTINUE   
  4770.             CALL WMUL(AR(I,I),AI(I,I),DETR(1),DETI(1),DETR(1),DETI(1))          
  4771. C           ...EXIT    
  4772. C        ...EXIT       
  4773.             IF (CABS1(DETR(1),DETI(1)) .EQ. 0.0D0) GO TO 70  
  4774.    20       IF (CABS1(DETR(1),DETI(1)) .GE. 1.0D0) GO TO 30  
  4775.                DETR(1) = TEN*DETR(1)      
  4776.                DETI(1) = TEN*DETI(1)      
  4777.                DETR(2) = DETR(2) - 1.0D0  
  4778.                DETI(2) = DETI(2) - 0.0D0  
  4779.             GO TO 20   
  4780.    30       CONTINUE   
  4781.    40       IF (CABS1(DETR(1),DETI(1)) .LT. TEN) GO TO 50    
  4782.                DETR(1) = DETR(1)/TEN      
  4783.                DETI(1) = DETI(1)/TEN      
  4784.                DETR(2) = DETR(2) + 1.0D0  
  4785.                DETI(2) = DETI(2) + 0.0D0  
  4786.             GO TO 40   
  4787.    50       CONTINUE   
  4788.    60    CONTINUE      
  4789.    70    CONTINUE      
  4790.    80 CONTINUE         
  4791. C                      
  4792. C     COMPUTE INVERSE(U)                  
  4793. C                      
  4794.       IF (MOD(JOB,10) .EQ. 0) GO TO 160   
  4795.          DO 110 K = 1, N                  
  4796.             CALL WDIV(1.0D0,0.0D0,AR(K,K),AI(K,K),AR(K,K),AI(K,K))              
  4797.             TR = -AR(K,K)                 
  4798.             TI = -AI(K,K)                 
  4799.             CALL WSCAL(K-1,TR,TI,AR(1,K),AI(1,K),1)          
  4800.             KP1 = K + 1                   
  4801.             IF (N .LT. KP1) GO TO 100     
  4802.             DO 90 J = KP1, N              
  4803.                TR = AR(K,J)               
  4804.                TI = AI(K,J)               
  4805.                AR(K,J) = 0.0D0            
  4806.                AI(K,J) = 0.0D0            
  4807.                CALL WAXPY(K,TR,TI,AR(1,K),AI(1,K),1,AR(1,J),AI(1,J),1)          
  4808.    90       CONTINUE   
  4809.   100       CONTINUE   
  4810.   110    CONTINUE      
  4811. C                      
  4812. C        FORM INVERSE(U)*INVERSE(L)       
  4813. C                      
  4814.          NM1 = N - 1   
  4815.          IF (NM1 .LT. 1) GO TO 150        
  4816.          DO 140 KB = 1, NM1               
  4817.             K = N - KB                    
  4818.             KP1 = K + 1                   
  4819.             DO 120 I = KP1, N             
  4820.                WORKR(I) = AR(I,K)         
  4821.                WORKI(I) = AI(I,K)         
  4822.                AR(I,K) = 0.0D0            
  4823.                AI(I,K) = 0.0D0            
  4824.   120       CONTINUE   
  4825.             DO 130 J = KP1, N             
  4826.                TR = WORKR(J)              
  4827.                TI = WORKI(J)              
  4828.                CALL WAXPY(N,TR,TI,AR(1,J),AI(1,J),1,AR(1,K),AI(1,K),1)          
  4829.   130       CONTINUE   
  4830.             L = IPVT(K)                   
  4831.             IF (L .NE. K)                 
  4832.      *         CALL WSWAP(N,AR(1,K),AI(1,K),1,AR(1,L),AI(1,L),1)                
  4833.   140    CONTINUE      
  4834.   150    CONTINUE      
  4835.   160 CONTINUE         
  4836.       RETURN           
  4837.       END              
  4838.       SUBROUTINE WPOFA(AR,AI,LDA,N,INFO)  
  4839.       DOUBLE PRECISION AR(LDA,1),AI(LDA,1)                   
  4840.       DOUBLE PRECISION S,TR,TI,WDOTCR,WDOTCI                 
  4841.       DO 30 J = 1, N   
  4842.          INFO = J      
  4843.          S = 0.0D0     
  4844.          JM1 = J-1     
  4845.          IF (JM1 .LT. 1) GO TO 20         
  4846.          DO 10 K = 1, JM1                 
  4847.             TR = AR(K,J)-WDOTCR(K-1,AR(1,K),AI(1,K),1,AR(1,J),AI(1,J),1)        
  4848.             TI = AI(K,J)-WDOTCI(K-1,AR(1,K),AI(1,K),1,AR(1,J),AI(1,J),1)        
  4849.             CALL WDIV(TR,TI,AR(K,K),AI(K,K),TR,TI)           
  4850.             AR(K,J) = TR                  
  4851.             AI(K,J) = TI                  
  4852.             S = S + TR*TR + TI*TI         
  4853.    10    CONTINUE      
  4854.    20    CONTINUE      
  4855.          S = AR(J,J) - S                  
  4856.          IF (S.LE.0.0D0 .OR. AI(J,J).NE.0.0D0) GO TO 40      
  4857.          AR(J,J) = DSQRT(S)               
  4858.    30 CONTINUE         
  4859.       INFO = 0         
  4860.    40 RETURN           
  4861.       END              
  4862.       SUBROUTINE RREF(AR,AI,LDA,M,N,EPS)  
  4863.       DOUBLE PRECISION AR(LDA,1),AI(LDA,1),EPS,TOL,TR,TI,WASUM                  
  4864.       TOL = 0.0D0      
  4865.       DO 10 J = 1, N   
  4866.          TOL = DMAX1(TOL,WASUM(M,AR(1,J),AI(1,J),1))         
  4867.    10 CONTINUE         
  4868.       TOL = EPS*DFLOAT(2*MAX0(M,N))*TOL   
  4869.       K = 1            
  4870.       L = 1            
  4871.    20 IF (K.GT.M .OR. L.GT.N) RETURN      
  4872.       I = IWAMAX(M-K+1,AR(K,L),AI(K,L),1) + K-1              
  4873.       IF (DABS(AR(I,L))+DABS(AI(I,L)) .GT. TOL) GO TO 30     
  4874.          CALL WSET(M-K+1,0.0D0,0.0D0,AR(K,L),AI(K,L),1)      
  4875.          L = L+1       
  4876.          GO TO 20      
  4877.    30 CALL WSWAP(N-L+1,AR(I,L),AI(I,L),LDA,AR(K,L),AI(K,L),LDA)                 
  4878.       CALL WDIV(1.0D0,0.0D0,AR(K,L),AI(K,L),TR,TI)           
  4879.       CALL WSCAL(N-L+1,TR,TI,AR(K,L),AI(K,L),LDA)            
  4880.       AR(K,L) = 1.0D0                     
  4881.       AI(K,L) = 0.0D0                     
  4882.       DO 40 I = 1, M   
  4883.          TR = -AR(I,L)                    
  4884.          TI = -AI(I,L)                    
  4885.          IF (I .NE. K) CALL WAXPY(N-L+1,TR,TI,               
  4886.      $                 AR(K,L),AI(K,L),LDA,AR(I,L),AI(I,L),LDA)                 
  4887.    40 CONTINUE         
  4888.       K = K+1          
  4889.       L = L+1          
  4890.       GO TO 20         
  4891.       END              
  4892.       SUBROUTINE HILBER(A,LDA,N)          
  4893.       DOUBLE PRECISION A(LDA,N)           
  4894. C     GENERATE INVERSE HILBERT MATRIX     
  4895.       DOUBLE PRECISION P,R                
  4896.       P = DFLOAT(N)    
  4897.       DO 20 I = 1, N   
  4898.         IF (I.NE.1) P = (DFLOAT(N-I+1)*P*DFLOAT(N+I-1))/DFLOAT(I-1)**2          
  4899.         R = P*P        
  4900.         A(I,I) = R/DFLOAT(2*I-1)          
  4901.         IF (I.EQ.N) GO TO 20              
  4902.         IP1 = I+1      
  4903.         DO 10 J = IP1, N                  
  4904.           R = -(DFLOAT(N-J+1)*R*(N+J-1))/DFLOAT(J-1)**2      
  4905.           A(I,J) = R/DFLOAT(I+J-1)        
  4906.           A(J,I) = A(I,J)                 
  4907.    10   CONTINUE       
  4908.    20 CONTINUE         
  4909.       RETURN           
  4910.       END              
  4911.       SUBROUTINE HTRIDI(NM,N,AR,AI,D,E,E2,TAU)               
  4912. C                      
  4913.       INTEGER I,J,K,L,N,II,NM,JP1         
  4914.       DOUBLE PRECISION AR(NM,N),AI(NM,N),D(N),E(N),E2(N),TAU(2,N)               
  4915.       DOUBLE PRECISION F,G,H,FI,GI,HH,SI,SCALE               
  4916.       DOUBLE PRECISION FLOP,PYTHAG        
  4917. C                      
  4918. C     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF                 
  4919. C     THE ALGOL PROCEDURE TRED1, NUM. MATH. 11, 181-195(1968)                   
  4920. C     BY MARTIN, REINSCH, AND WILKINSON.  
  4921. C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).           
  4922. C                      
  4923. C     THIS SUBROUTINE REDUCES A COMPLEX HERMITIAN MATRIX     
  4924. C     TO A REAL SYMMETRIC TRIDIAGONAL MATRIX USING           
  4925. C     UNITARY SIMILARITY TRANSFORMATIONS.                    
  4926. C                      
  4927. C     ON INPUT.        
  4928. C                      
  4929. C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL                 
  4930. C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM                  
  4931. C          DIMENSION STATEMENT.           
  4932. C                      
  4933. C        N IS THE ORDER OF THE MATRIX.    
  4934. C                      
  4935. C        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,     
  4936. C          RESPECTIVELY, OF THE COMPLEX HERMITIAN INPUT MATRIX.                 
  4937. C          ONLY THE LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED.              
  4938. C                      
  4939. C     ON OUTPUT.       
  4940. C                      
  4941. C        AR AND AI CONTAIN INFORMATION ABOUT THE UNITARY TRANS-                 
  4942. C          FORMATIONS USED IN THE REDUCTION IN THEIR FULL LOWER                 
  4943. C          TRIANGLES.  THEIR STRICT UPPER TRIANGLES AND THE  
  4944. C          DIAGONAL OF AR ARE UNALTERED.  
  4945. C                      
  4946. C        D CONTAINS THE DIAGONAL ELEMENTS OF THE THE TRIDIAGONAL MATRIX.        
  4947. C                      
  4948. C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL                 
  4949. C          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO.              
  4950. C                      
  4951. C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.            
  4952. C          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED.                
  4953. C                      
  4954. C        TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS.            
  4955. C                      
  4956. C     MODIFIED TO GET RID OF ALL COMPLEX ARITHMETIC, C. MOLER, 6/27/79.         
  4957. C                      
  4958. C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW,                
  4959. C     APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY                 
  4960. C                      
  4961. C     ------------------------------------------------------------------        
  4962. C                      
  4963.       TAU(1,N) = 1.0D0                    
  4964.       TAU(2,N) = 0.0D0                    
  4965. C                      
  4966.       DO 100 I = 1, N                     
  4967.   100 D(I) = AR(I,I)   
  4968. C     .......... FOR I=N STEP -1 UNTIL 1 DO -- ..........    
  4969.       DO 300 II = 1, N                    
  4970.          I = N + 1 - II                   
  4971.          L = I - 1     
  4972.          H = 0.0D0     
  4973.          SCALE = 0.0D0                    
  4974.          IF (L .LT. 1) GO TO 130          
  4975. C     .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) ..........               
  4976.          DO 120 K = 1, L                  
  4977.   120    SCALE = FLOP(SCALE + DABS(AR(I,K)) + DABS(AI(I,K))) 
  4978. C                      
  4979.          IF (SCALE .NE. 0.0D0) GO TO 140  
  4980.          TAU(1,L) = 1.0D0                 
  4981.          TAU(2,L) = 0.0D0                 
  4982.   130    E(I) = 0.0D0                     
  4983.          E2(I) = 0.0D0                    
  4984.          GO TO 290     
  4985. C                      
  4986.   140    DO 150 K = 1, L                  
  4987.             AR(I,K) = FLOP(AR(I,K)/SCALE)                    
  4988.             AI(I,K) = FLOP(AI(I,K)/SCALE)                    
  4989.             H = FLOP(H + AR(I,K)*AR(I,K) + AI(I,K)*AI(I,K))  
  4990.   150    CONTINUE      
  4991. C                      
  4992.          E2(I) = FLOP(SCALE*SCALE*H)      
  4993.          G = FLOP(DSQRT(H))               
  4994.          E(I) = FLOP(SCALE*G)             
  4995.          F = PYTHAG(AR(I,L),AI(I,L))      
  4996. C     .......... FORM NEXT DIAGONAL ELEMENT OF MATRIX T ..........              
  4997.          IF (F .EQ. 0.0D0) GO TO 160      
  4998.          TAU(1,L) = FLOP((AI(I,L)*TAU(2,I) - AR(I,L)*TAU(1,I))/F)               
  4999.          SI = FLOP((AR(I,L)*TAU(2,I) + AI(I,L)*TAU(1,I))/F)  
  5000.          H = FLOP(H + F*G)                
  5001.          G = FLOP(1.0D0 + G/F)            
  5002.          AR(I,L) = FLOP(G*AR(I,L))        
  5003.          AI(I,L) = FLOP(G*AI(I,L))        
  5004.          IF (L .EQ. 1) GO TO 270          
  5005.          GO TO 170     
  5006.   160    TAU(1,L) = -TAU(1,I)             
  5007.          SI = TAU(2,I)                    
  5008.          AR(I,L) = G   
  5009.   170    F = 0.0D0     
  5010. C                      
  5011.          DO 240 J = 1, L                  
  5012.             G = 0.0D0                     
  5013.             GI = 0.0D0                    
  5014. C     .......... FORM ELEMENT OF A*U ..........              
  5015.             DO 180 K = 1, J               
  5016.                G = FLOP(G + AR(J,K)*AR(I,K) + AI(J,K)*AI(I,K))                  
  5017.                GI = FLOP(GI - AR(J,K)*AI(I,K) + AI(J,K)*AR(I,K))                
  5018.   180       CONTINUE   
  5019. C                      
  5020.             JP1 = J + 1                   
  5021.             IF (L .LT. JP1) GO TO 220     
  5022. C                      
  5023.             DO 200 K = JP1, L             
  5024.                G = FLOP(G + AR(K,J)*AR(I,K) - AI(K,J)*AI(I,K))                  
  5025.                GI = FLOP(GI - AR(K,J)*AI(I,K) - AI(K,J)*AR(I,K))                
  5026.   200       CONTINUE   
  5027. C     .......... FORM ELEMENT OF P ..........                
  5028.   220       E(J) = FLOP(G/H)              
  5029.             TAU(2,J) = FLOP(GI/H)         
  5030.             F = FLOP(F + E(J)*AR(I,J) - TAU(2,J)*AI(I,J))    
  5031.   240    CONTINUE      
  5032. C                      
  5033.          HH = FLOP(F/(H + H))             
  5034. C     .......... FORM REDUCED A ..........                   
  5035.          DO 260 J = 1, L                  
  5036.             F = AR(I,J)                   
  5037.             G = FLOP(E(J) - HH*F)         
  5038.             E(J) = G   
  5039.             FI = -AI(I,J)                 
  5040.             GI = FLOP(TAU(2,J) - HH*FI)   
  5041.             TAU(2,J) = -GI                
  5042. C                      
  5043.             DO 260 K = 1, J               
  5044.                AR(J,K) = FLOP(AR(J,K) - F*E(K) - G*AR(I,K)   
  5045.      X        + FI*TAU(2,K) + GI*AI(I,K)) 
  5046.                AI(J,K) = FLOP(AI(J,K) - F*TAU(2,K) - G*AI(I,K)                  
  5047.      X        - FI*E(K) - GI*AR(I,K))     
  5048.   260    CONTINUE      
  5049. C                      
  5050.   270    DO 280 K = 1, L                  
  5051.             AR(I,K) = FLOP(SCALE*AR(I,K))                    
  5052.             AI(I,K) = FLOP(SCALE*AI(I,K))                    
  5053.   280    CONTINUE      
  5054. C                      
  5055.          TAU(2,L) = -SI                   
  5056.   290    HH = D(I)     
  5057.          D(I) = AR(I,I)                   
  5058.          AR(I,I) = HH                     
  5059.          AI(I,I) = FLOP(SCALE*DSQRT(H))   
  5060.   300 CONTINUE         
  5061. C                      
  5062.       RETURN           
  5063.       END              
  5064.       SUBROUTINE HTRIBK(NM,N,AR,AI,TAU,M,ZR,ZI)              
  5065. C                      
  5066.       INTEGER I,J,K,L,M,N,NM              
  5067.       DOUBLE PRECISION AR(NM,N),AI(NM,N),TAU(2,N),ZR(NM,M),ZI(NM,M)             
  5068.       DOUBLE PRECISION H,S,SI,FLOP        
  5069. C                      
  5070. C     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF                 
  5071. C     THE ALGOL PROCEDURE TRBAK1, NUM. MATH. 11, 181-195(1968)                  
  5072. C     BY MARTIN, REINSCH, AND WILKINSON.  
  5073. C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).           
  5074. C                      
  5075. C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX HERMITIAN             
  5076. C     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING 
  5077. C     REAL SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY  HTRIDI.                  
  5078. C                      
  5079. C     ON INPUT.        
  5080. C                      
  5081. C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL                 
  5082. C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM                  
  5083. C          DIMENSION STATEMENT.           
  5084. C                      
  5085. C        N IS THE ORDER OF THE MATRIX.    
  5086. C                      
  5087. C        AR AND AI CONTAIN INFORMATION ABOUT THE UNITARY TRANS-                 
  5088. C          FORMATIONS USED IN THE REDUCTION BY  HTRIDI  IN THEIR                
  5089. C          FULL LOWER TRIANGLES EXCEPT FOR THE DIAGONAL OF AR.                  
  5090. C                      
  5091. C        TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS.            
  5092. C                      
  5093. C        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.                
  5094. C                      
  5095. C        ZR CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED 
  5096. C          IN ITS FIRST M COLUMNS.        
  5097. C                      
  5098. C     ON OUTPUT.       
  5099. C                      
  5100. C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,     
  5101. C          RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORS     
  5102. C          IN THEIR FIRST M COLUMNS.      
  5103. C                      
  5104. C     NOTE THAT THE LAST COMPONENT OF EACH RETURNED VECTOR   
  5105. C     IS REAL AND THAT VECTOR EUCLIDEAN NORMS ARE PRESERVED. 
  5106. C                      
  5107. C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW,                
  5108. C     APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY                 
  5109. C                      
  5110. C     ------------------------------------------------------------------        
  5111. C                      
  5112.       IF (M .EQ. 0) GO TO 200             
  5113. C     .......... TRANSFORM THE EIGENVECTORS OF THE REAL SYMMETRIC               
  5114. C                TRIDIAGONAL MATRIX TO THOSE OF THE HERMITIAN                   
  5115. C                TRIDIAGONAL MATRIX. ..........              
  5116.       DO 50 K = 1, N   
  5117. C                      
  5118.          DO 50 J = 1, M                   
  5119.             ZI(K,J) = FLOP(-ZR(K,J)*TAU(2,K))                
  5120.             ZR(K,J) = FLOP(ZR(K,J)*TAU(1,K))                 
  5121.    50 CONTINUE         
  5122. C                      
  5123.       IF (N .EQ. 1) GO TO 200             
  5124. C     .......... RECOVER AND APPLY THE HOUSEHOLDER MATRICES ..........          
  5125.       DO 140 I = 2, N                     
  5126.          L = I - 1     
  5127.          H = AI(I,I)   
  5128.          IF (H .EQ. 0.0D0) GO TO 140      
  5129. C                      
  5130.          DO 130 J = 1, M                  
  5131.             S = 0.0D0                     
  5132.             SI = 0.0D0                    
  5133. C                      
  5134.             DO 110 K = 1, L               
  5135.                S = FLOP(S + AR(I,K)*ZR(K,J) - AI(I,K)*ZI(K,J))                  
  5136.                SI = FLOP(SI + AR(I,K)*ZI(K,J) + AI(I,K)*ZR(K,J))                
  5137.   110       CONTINUE   
  5138. C     .......... DOUBLE DIVISIONS AVOID POSSIBLE UNDERFLOW ..........           
  5139.             S = FLOP((S/H)/H)             
  5140.             SI = FLOP((SI/H)/H)           
  5141. C                      
  5142.             DO 120 K = 1, L               
  5143.                ZR(K,J) = FLOP(ZR(K,J) - S*AR(I,K) - SI*AI(I,K))                 
  5144.                ZI(K,J) = FLOP(ZI(K,J) - SI*AR(I,K) + S*AI(I,K))                 
  5145.   120       CONTINUE   
  5146. C                      
  5147.   130    CONTINUE      
  5148. C                      
  5149.   140 CONTINUE         
  5150. C                      
  5151.   200 RETURN           
  5152.       END              
  5153.       SUBROUTINE IMTQL2(NM,N,D,E,Z,IERR,JOB)                 
  5154. C                      
  5155.       INTEGER I,J,K,L,M,N,II,NM,MML,IERR  
  5156.       DOUBLE PRECISION D(N),E(N),Z(NM,N)  
  5157.       DOUBLE PRECISION B,C,F,G,P,R,S      
  5158.       DOUBLE PRECISION FLOP               
  5159. C                      
  5160. C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE IMTQL2,           
  5161. C     NUM. MATH. 12, 377-383(1968) BY MARTIN AND WILKINSON,  
  5162. C     AS MODIFIED IN NUM. MATH. 15, 450(1970) BY DUBRULLE.   
  5163. C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 241-248(1971).           
  5164. C                      
  5165. C     THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS 
  5166. C     OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE IMPLICIT QL METHOD.              
  5167. C     THE EIGENVECTORS OF A FULL SYMMETRIC MATRIX CAN ALSO   
  5168. C     BE FOUND IF  TRED2  HAS BEEN USED TO REDUCE THIS       
  5169. C     FULL MATRIX TO TRIDIAGONAL FORM.    
  5170. C                      
  5171. C     ON INPUT.        
  5172. C                      
  5173. C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL                 
  5174. C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM                  
  5175. C          DIMENSION STATEMENT.           
  5176. C                      
  5177. C        N IS THE ORDER OF THE MATRIX.    
  5178. C                      
  5179. C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.                  
  5180. C                      
  5181. C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX                
  5182. C          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.    
  5183. C                      
  5184. C        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE                   
  5185. C          REDUCTION BY  TRED2, IF PERFORMED.  IF THE EIGENVECTORS              
  5186. C          OF THE TRIDIAGONAL MATRIX ARE DESIRED, Z MUST CONTAIN                
  5187. C          THE IDENTITY MATRIX.           
  5188. C                      
  5189. C      ON OUTPUT.      
  5190. C                      
  5191. C        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN                  
  5192. C          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT BUT                  
  5193. C          UNORDERED FOR INDICES 1,2,...,IERR-1.             
  5194. C                      
  5195. C        E HAS BEEN DESTROYED.            
  5196. C                      
  5197. C        Z CONTAINS ORTHONORMAL EIGENVECTORS OF THE SYMMETRIC                   
  5198. C          TRIDIAGONAL (OR FULL) MATRIX.  IF AN ERROR EXIT IS MADE,             
  5199. C          Z CONTAINS THE EIGENVECTORS ASSOCIATED WITH THE STORED               
  5200. C          EIGENVALUES.                   
  5201. C                      
  5202. C        IERR IS SET TO                   
  5203. C          ZERO       FOR NORMAL RETURN,  
  5204. C          J          IF THE J-TH EIGENVALUE HAS NOT BEEN    
  5205. C  DETERMINED AFTER 30 ITERATIONS.        
  5206. C                      
  5207. C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW,                
  5208. C     APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY                 
  5209. C                      
  5210. C     ------------------------------------------------------------------        
  5211. C                      
  5212. C                      
  5213. C*****                 
  5214. C     MODIFIED BY C. MOLER TO ELIMINATE MACHEP 11/22/78      
  5215. C     MODIFIED TO ADD JOB PARAMETER 08/27/79                 
  5216. C*****                 
  5217.       IERR = 0         
  5218.       IF (N .EQ. 1) GO TO 1001            
  5219. C                      
  5220.       DO 100 I = 2, N                     
  5221.   100 E(I-1) = E(I)    
  5222. C                      
  5223.       E(N) = 0.0D0     
  5224. C                      
  5225.       DO 240 L = 1, N                     
  5226.          J = 0         
  5227. C     .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT ..........                 
  5228.   105    DO 110 M = L, N                  
  5229.             IF (M .EQ. N) GO TO 120       
  5230. C*****                 
  5231.             P = FLOP(DABS(D(M)) + DABS(D(M+1)))              
  5232.             S = FLOP(P + DABS(E(M)))      
  5233.             IF (P .EQ. S) GO TO 120       
  5234. C*****                 
  5235.   110    CONTINUE      
  5236. C                      
  5237.   120    P = D(L)      
  5238.          IF (M .EQ. L) GO TO 240          
  5239.          IF (J .EQ. 30) GO TO 1000        
  5240.          J = J + 1     
  5241. C     .......... FORM SHIFT ..........    
  5242.          G = FLOP((D(L+1) - P)/(2.0D0*E(L)))                 
  5243.          R = FLOP(DSQRT(G*G+1.0D0))       
  5244.          G = FLOP(D(M) - P + E(L)/(G + DSIGN(R,G)))          
  5245.          S = 1.0D0     
  5246.          C = 1.0D0     
  5247.          P = 0.0D0     
  5248.          MML = M - L   
  5249. C     .......... FOR I=M-1 STEP -1 UNTIL L DO -- ..........  
  5250.          DO 200 II = 1, MML               
  5251.             I = M - II                    
  5252.             F = FLOP(S*E(I))              
  5253.             B = FLOP(C*E(I))              
  5254.             IF (DABS(F) .LT. DABS(G)) GO TO 150              
  5255.             C = FLOP(G/F)                 
  5256.             R = FLOP(DSQRT(C*C+1.0D0))    
  5257.             E(I+1) = FLOP(F*R)            
  5258.             S = FLOP(1.0D0/R)             
  5259.             C = FLOP(C*S)                 
  5260.             GO TO 160                     
  5261.   150       S = FLOP(F/G)                 
  5262.             R = FLOP(DSQRT(S*S+1.0D0))    
  5263.             E(I+1) = FLOP(G*R)            
  5264.             C = FLOP(1.0D0/R)             
  5265.             S = FLOP(S*C)                 
  5266.   160       G = FLOP(D(I+1) - P)          
  5267.             R = FLOP((D(I) - G)*S + 2.0D0*C*B)               
  5268.             P = FLOP(S*R)                 
  5269.             D(I+1) = G + P                
  5270.             G = FLOP(C*R - B)             
  5271.             IF (JOB .EQ. 0) GO TO 185     
  5272. C     .......... FORM VECTOR ..........   
  5273.             DO 180 K = 1, N               
  5274.                F = Z(K,I+1)               
  5275.                Z(K,I+1) = FLOP(S*Z(K,I) + C*F)               
  5276.                Z(K,I) = FLOP(C*Z(K,I) - S*F)                 
  5277.   180       CONTINUE   
  5278.   185       CONTINUE   
  5279. C                      
  5280.   200    CONTINUE      
  5281. C                      
  5282.          D(L) = FLOP(D(L) - P)            
  5283.          E(L) = G      
  5284.          E(M) = 0.0D0                     
  5285.          GO TO 105     
  5286.   240 CONTINUE         
  5287. C     .......... ORDER EIGENVALUES AND EIGENVECTORS ..........                  
  5288.       DO 300 II = 2, N                    
  5289.          I = II - 1    
  5290.          K = I         
  5291.          P = D(I)      
  5292. C                      
  5293.          DO 260 J = II, N                 
  5294.             IF (D(J) .GE. P) GO TO 260    
  5295.             K = J      
  5296.             P = D(J)   
  5297.   260    CONTINUE      
  5298. C                      
  5299.          IF (K .EQ. I) GO TO 300          
  5300.          D(K) = D(I)   
  5301.          D(I) = P      
  5302. C                      
  5303.          IF (JOB .EQ. 0) GO TO 285        
  5304.          DO 280 J = 1, N                  
  5305.             P = Z(J,I)                    
  5306.             Z(J,I) = Z(J,K)               
  5307.             Z(J,K) = P                    
  5308.   280    CONTINUE      
  5309.   285    CONTINUE      
  5310. C                      
  5311.   300 CONTINUE         
  5312. C                      
  5313.       GO TO 1001       
  5314. C     .......... SET ERROR -- NO CONVERGENCE TO AN           
  5315. C                EIGENVALUE AFTER 30 ITERATIONS ..........   
  5316.  1000 IERR = L         
  5317.  1001 RETURN           
  5318.       END              
  5319.       SUBROUTINE CORTH(NM,N,LOW,IGH,AR,AI,ORTR,ORTI)         
  5320. C                      
  5321.       INTEGER I,J,M,N,II,JJ,LA,MP,NM,IGH,KP1,LOW             
  5322.       DOUBLE PRECISION AR(NM,N),AI(NM,N),ORTR(IGH),ORTI(IGH) 
  5323.       DOUBLE PRECISION F,G,H,FI,FR,SCALE  
  5324.       DOUBLE PRECISION FLOP,PYTHAG        
  5325. C                      
  5326. C     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF                 
  5327. C     THE ALGOL PROCEDURE ORTHES, NUM. MATH. 12, 349-368(1968)                  
  5328. C     BY MARTIN AND WILKINSON.            
  5329. C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).           
  5330. C                      
  5331. C     GIVEN A COMPLEX GENERAL MATRIX, THIS SUBROUTINE        
  5332. C     REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNS       
  5333. C     LOW THROUGH IGH TO UPPER HESSENBERG FORM BY            
  5334. C     UNITARY SIMILARITY TRANSFORMATIONS.                    
  5335. C                      
  5336. C     ON INPUT.        
  5337. C                      
  5338. C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL                 
  5339. C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM                  
  5340. C          DIMENSION STATEMENT.           
  5341. C                      
  5342. C        N IS THE ORDER OF THE MATRIX.    
  5343. C                      
  5344. C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING                   
  5345. C          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED,   
  5346. C          SET LOW=1, IGH=N.              
  5347. C                      
  5348. C        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,     
  5349. C          RESPECTIVELY, OF THE COMPLEX INPUT MATRIX.        
  5350. C                      
  5351. C     ON OUTPUT.       
  5352. C                      
  5353. C        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,     
  5354. C          RESPECTIVELY, OF THE HESSENBERG MATRIX.  INFORMATION                 
  5355. C          ABOUT THE UNITARY TRANSFORMATIONS USED IN THE REDUCTION              
  5356. C          IS STORED IN THE REMAINING TRIANGLES UNDER THE    
  5357. C          HESSENBERG MATRIX.             
  5358. C                      
  5359. C        ORTR AND ORTI CONTAIN FURTHER INFORMATION ABOUT THE 
  5360. C          TRANSFORMATIONS.  ONLY ELEMENTS LOW THROUGH IGH ARE USED.            
  5361. C                      
  5362. C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW,                
  5363. C     APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY                 
  5364. C                      
  5365. C     ------------------------------------------------------------------        
  5366. C                      
  5367.       LA = IGH - 1     
  5368.       KP1 = LOW + 1    
  5369.       IF (LA .LT. KP1) GO TO 200          
  5370. C                      
  5371.       DO 180 M = KP1, LA                  
  5372.          H = 0.0D0     
  5373.          ORTR(M) = 0.0D0                  
  5374.          ORTI(M) = 0.0D0                  
  5375.          SCALE = 0.0D0                    
  5376. C     .......... SCALE COLUMN (ALGOL TOL THEN NOT NEEDED) ..........            
  5377.          DO 90 I = M, IGH                 
  5378.    90    SCALE = FLOP(SCALE + DABS(AR(I,M-1)) + DABS(AI(I,M-1)))                
  5379. C                      
  5380.          IF (SCALE .EQ. 0.0D0) GO TO 180  
  5381.          MP = M + IGH                     
  5382. C     .......... FOR I=IGH STEP -1 UNTIL M DO -- ..........  
  5383.          DO 100 II = M, IGH               
  5384.             I = MP - II                   
  5385.             ORTR(I) = FLOP(AR(I,M-1)/SCALE)                  
  5386.             ORTI(I) = FLOP(AI(I,M-1)/SCALE)                  
  5387.             H = FLOP(H + ORTR(I)*ORTR(I) + ORTI(I)*ORTI(I))  
  5388.   100    CONTINUE      
  5389. C                      
  5390.          G = FLOP(DSQRT(H))               
  5391.          F = PYTHAG(ORTR(M),ORTI(M))      
  5392.          IF (F .EQ. 0.0D0) GO TO 103      
  5393.          H = FLOP(H + F*G)                
  5394.          G = FLOP(G/F)                    
  5395.          ORTR(M) = FLOP((1.0D0 + G)*ORTR(M))                 
  5396.          ORTI(M) = FLOP((1.0D0 + G)*ORTI(M))                 
  5397.          GO TO 105     
  5398. C                      
  5399.   103    ORTR(M) = G   
  5400.          AR(M,M-1) = SCALE                
  5401. C     .......... FORM (I-(U*UT)/H)*A ..........              
  5402.   105    DO 130 J = M, N                  
  5403.             FR = 0.0D0                    
  5404.             FI = 0.0D0                    
  5405. C     .......... FOR I=IGH STEP -1 UNTIL M DO -- ..........  
  5406.             DO 110 II = M, IGH            
  5407.                I = MP - II                
  5408.                FR = FLOP(FR + ORTR(I)*AR(I,J) + ORTI(I)*AI(I,J))                
  5409.                FI = FLOP(FI + ORTR(I)*AI(I,J) - ORTI(I)*AR(I,J))                
  5410.   110       CONTINUE   
  5411. C                      
  5412.             FR = FLOP(FR/H)               
  5413.             FI = FLOP(FI/H)               
  5414. C                      
  5415.             DO 120 I = M, IGH             
  5416.                AR(I,J) = FLOP(AR(I,J) - FR*ORTR(I) + FI*ORTI(I))                
  5417.                AI(I,J) = FLOP(AI(I,J) - FR*ORTI(I) - FI*ORTR(I))                
  5418.   120       CONTINUE   
  5419. C                      
  5420.   130    CONTINUE      
  5421. C     .......... FORM (I-(U*UT)/H)*A*(I-(U*UT)/H) .......... 
  5422.          DO 160 I = 1, IGH                
  5423.             FR = 0.0D0                    
  5424.             FI = 0.0D0                    
  5425. C     .......... FOR J=IGH STEP -1 UNTIL M DO -- ..........  
  5426.             DO 140 JJ = M, IGH            
  5427.                J = MP - JJ                
  5428.                FR = FLOP(FR + ORTR(J)*AR(I,J) - ORTI(J)*AI(I,J))                
  5429.                FI = FLOP(FI + ORTR(J)*AI(I,J) + ORTI(J)*AR(I,J))                
  5430.   140       CONTINUE   
  5431. C                      
  5432.             FR = FLOP(FR/H)               
  5433.             FI = FLOP(FI/H)               
  5434. C                      
  5435.             DO 150 J = M, IGH             
  5436.                AR(I,J) = FLOP(AR(I,J) - FR*ORTR(J) - FI*ORTI(J))                
  5437.                AI(I,J) = FLOP(AI(I,J) + FR*ORTI(J) - FI*ORTR(J))                
  5438.   150       CONTINUE   
  5439. C                      
  5440.   160    CONTINUE      
  5441. C                      
  5442.          ORTR(M) = FLOP(SCALE*ORTR(M))    
  5443.          ORTI(M) = FLOP(SCALE*ORTI(M))    
  5444.          AR(M,M-1) = FLOP(-G*AR(M,M-1))   
  5445.          AI(M,M-1) = FLOP(-G*AI(M,M-1))   
  5446.   180 CONTINUE         
  5447. C                      
  5448.   200 RETURN           
  5449.       END              
  5450.       SUBROUTINE COMQR3(NM,N,LOW,IGH,ORTR,ORTI,HR,HI,WR,WI,ZR,ZI,IERR           
  5451.      *                 ,JOB)              
  5452. C*****                 
  5453. C     MODIFICATION OF EISPACK COMQR2 TO ADD JOB PARAMETER    
  5454. C     JOB = 0  OUTPUT H = SCHUR TRIANGULAR FORM, Z NOT USED  
  5455. C         = 1  OUTPUT H = SCHUR FORM, Z = UNITARY SIMILARITY 
  5456. C         = 2  SAME AS COMQR2             
  5457. C         = 3  OUTPUT H = HESSENBERG FORM, Z = UNITARY SIMILARITY               
  5458. C     ALSO ELIMINATE MACHEP               
  5459. C     C. MOLER, 11/22/78 AND 09/14/80     
  5460. C     OVERFLOW CONTROL IN EIGENVECTOR BACKSUBSTITUTION, 3/16/82                 
  5461. C*****                 
  5462. C                      
  5463.       INTEGER I,J,K,L,M,N,EN,II,JJ,LL,NM,NN,IGH,IP1,         
  5464.      X        ITN,ITS,LOW,LP1,ENM1,IEND,IERR                 
  5465.       DOUBLE PRECISION HR(NM,N),HI(NM,N),WR(N),WI(N),ZR(NM,N),ZI(NM,N),         
  5466.      X       ORTR(IGH),ORTI(IGH)          
  5467.       DOUBLE PRECISION SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,NORM  
  5468.       DOUBLE PRECISION FLOP,PYTHAG        
  5469. C                      
  5470. C     THIS SUBROUTINE IS A TRANSLATION OF A UNITARY ANALOGUE OF THE             
  5471. C     ALGOL PROCEDURE  COMLR2, NUM. MATH. 16, 181-204(1970) BY PETERS           
  5472. C     AND WILKINSON.   
  5473. C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971).           
  5474. C     THE UNITARY ANALOGUE SUBSTITUTES THE QR ALGORITHM OF FRANCIS              
  5475. C     (COMP. JOUR. 4, 332-345(1962)) FOR THE LR ALGORITHM.   
  5476. C                      
  5477. C     THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS 
  5478. C     OF A COMPLEX UPPER HESSENBERG MATRIX BY THE QR         
  5479. C     METHOD.  THE EIGENVECTORS OF A COMPLEX GENERAL MATRIX  
  5480. C     CAN ALSO BE FOUND IF  CORTH  HAS BEEN USED TO REDUCE   
  5481. C     THIS GENERAL MATRIX TO HESSENBERG FORM.                
  5482. C                      
  5483. C     ON INPUT.        
  5484. C                      
  5485. C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL                 
  5486. C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM                  
  5487. C          DIMENSION STATEMENT.           
  5488. C                      
  5489. C        N IS THE ORDER OF THE MATRIX.    
  5490. C                      
  5491. C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING                   
  5492. C          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED,   
  5493. C          SET LOW=1, IGH=N.              
  5494. C                      
  5495. C        ORTR AND ORTI CONTAIN INFORMATION ABOUT THE UNITARY TRANS-             
  5496. C          FORMATIONS USED IN THE REDUCTION BY  CORTH, IF PERFORMED.            
  5497. C          ONLY ELEMENTS LOW THROUGH IGH ARE USED.  IF THE EIGENVECTORS         
  5498. C          OF THE HESSENBERG MATRIX ARE DESIRED, SET ORTR(J) AND                
  5499. C          ORTI(J) TO 0.0D0 FOR THESE ELEMENTS.              
  5500. C                      
  5501. C        HR AND HI CONTAIN THE REAL AND IMAGINARY PARTS,     
  5502. C          RESPECTIVELY, OF THE COMPLEX UPPER HESSENBERG MATRIX.                
  5503. C          THEIR LOWER TRIANGLES BELOW THE SUBDIAGONAL CONTAIN FURTHER          
  5504. C          INFORMATION ABOUT THE TRANSFORMATIONS WHICH WERE USED IN THE         
  5505. C          REDUCTION BY  CORTH, IF PERFORMED.  IF THE EIGENVECTORS OF           
  5506. C          THE HESSENBERG MATRIX ARE DESIRED, THESE ELEMENTS MAY BE             
  5507. C          ARBITRARY.                     
  5508. C                      
  5509. C     ON OUTPUT.       
  5510. C                      
  5511. C        ORTR, ORTI, AND THE UPPER HESSENBERG PORTIONS OF HR AND HI             
  5512. C          HAVE BEEN DESTROYED.           
  5513. C                      
  5514. C        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,     
  5515. C          RESPECTIVELY, OF THE EIGENVALUES.  IF AN ERROR    
  5516. C          EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT   
  5517. C          FOR INDICES IERR+1,...,N.      
  5518. C                      
  5519. C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,     
  5520. C          RESPECTIVELY, OF THE EIGENVECTORS.  THE EIGENVECTORS                 
  5521. C          ARE UNNORMALIZED.  IF AN ERROR EXIT IS MADE, NONE OF                 
  5522. C          THE EIGENVECTORS HAS BEEN FOUND.                  
  5523. C                      
  5524. C        IERR IS SET TO                   
  5525. C          ZERO       FOR NORMAL RETURN,  
  5526. C          J          IF THE J-TH EIGENVALUE HAS NOT BEEN    
  5527. C  DETERMINED AFTER A TOTAL OF 30*N ITERATIONS.              
  5528. C                      
  5529. C     MODIFIED TO GET RID OF ALL COMPLEX ARITHMETIC, C. MOLER, 6/27/79.         
  5530. C                      
  5531. C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW,                
  5532. C     APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY                 
  5533. C                      
  5534. C     ------------------------------------------------------------------        
  5535. C                      
  5536.       IERR = 0         
  5537. C*****                 
  5538.       IF (JOB .EQ. 0) GO TO 150           
  5539. C*****                 
  5540. C     .......... INITIALIZE EIGENVECTOR MATRIX ..........    
  5541.       DO 100 I = 1, N                     
  5542. C                      
  5543.          DO 100 J = 1, N                  
  5544.             ZR(I,J) = 0.0D0               
  5545.             ZI(I,J) = 0.0D0               
  5546.             IF (I .EQ. J) ZR(I,J) = 1.0D0                    
  5547.   100 CONTINUE         
  5548. C     .......... FORM THE MATRIX OF ACCUMULATED TRANSFORMATIONS                 
  5549. C                FROM THE INFORMATION LEFT BY CORTH ..........                  
  5550.       IEND = IGH - LOW - 1                
  5551.       IF (IEND) 180, 150, 105             
  5552. C     .......... FOR I=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........               
  5553.   105 DO 140 II = 1, IEND                 
  5554.          I = IGH - II                     
  5555.          IF (ORTR(I) .EQ. 0.0D0 .AND. ORTI(I) .EQ. 0.0D0) GO TO 140             
  5556.          IF (HR(I,I-1) .EQ. 0.0D0 .AND. HI(I,I-1) .EQ. 0.0D0) GO TO 140         
  5557. C     .......... NORM BELOW IS NEGATIVE OF H FORMED IN CORTH ..........         
  5558.          NORM = FLOP(HR(I,I-1)*ORTR(I) + HI(I,I-1)*ORTI(I))  
  5559.          IP1 = I + 1   
  5560. C                      
  5561.          DO 110 K = IP1, IGH              
  5562.             ORTR(K) = HR(K,I-1)           
  5563.             ORTI(K) = HI(K,I-1)           
  5564.   110    CONTINUE      
  5565. C                      
  5566.          DO 130 J = I, IGH                
  5567.             SR = 0.0D0                    
  5568.             SI = 0.0D0                    
  5569. C                      
  5570.             DO 115 K = I, IGH             
  5571.                SR = FLOP(SR + ORTR(K)*ZR(K,J) + ORTI(K)*ZI(K,J))                
  5572.                SI = FLOP(SI + ORTR(K)*ZI(K,J) - ORTI(K)*ZR(K,J))                
  5573.   115       CONTINUE   
  5574. C                      
  5575.             SR = FLOP(SR/NORM)            
  5576.             SI = FLOP(SI/NORM)            
  5577. C                      
  5578.             DO 120 K = I, IGH             
  5579.                ZR(K,J) = FLOP(ZR(K,J) + SR*ORTR(K) - SI*ORTI(K))                
  5580.                ZI(K,J) = FLOP(ZI(K,J) + SR*ORTI(K) + SI*ORTR(K))                
  5581.   120       CONTINUE   
  5582. C                      
  5583.   130    CONTINUE      
  5584. C                      
  5585.   140 CONTINUE         
  5586. C*****                 
  5587.       IF (JOB .EQ. 3) GO TO 1001          
  5588. C*****                 
  5589. C     .......... CREATE REAL SUBDIAGONAL ELEMENTS .......... 
  5590.   150 L = LOW + 1      
  5591. C                      
  5592.       DO 170 I = L, IGH                   
  5593.          LL = MIN0(I+1,IGH)               
  5594.          IF (HI(I,I-1) .EQ. 0.0D0) GO TO 170                 
  5595.          NORM = PYTHAG(HR(I,I-1),HI(I,I-1))                  
  5596.          YR = FLOP(HR(I,I-1)/NORM)        
  5597.          YI = FLOP(HI(I,I-1)/NORM)        
  5598.          HR(I,I-1) = NORM                 
  5599.          HI(I,I-1) = 0.0D0                
  5600. C                      
  5601.          DO 155 J = I, N                  
  5602.             SI = FLOP(YR*HI(I,J) - YI*HR(I,J))               
  5603.             HR(I,J) = FLOP(YR*HR(I,J) + YI*HI(I,J))          
  5604.             HI(I,J) = SI                  
  5605.   155    CONTINUE      
  5606. C                      
  5607.          DO 160 J = 1, LL                 
  5608.             SI = FLOP(YR*HI(J,I) + YI*HR(J,I))               
  5609.             HR(J,I) = FLOP(YR*HR(J,I) - YI*HI(J,I))          
  5610.             HI(J,I) = SI                  
  5611.   160    CONTINUE      
  5612. C*****                 
  5613.          IF (JOB .EQ. 0) GO TO 170        
  5614. C*****                 
  5615.          DO 165 J = LOW, IGH              
  5616.             SI = FLOP(YR*ZI(J,I) + YI*ZR(J,I))               
  5617.             ZR(J,I) = FLOP(YR*ZR(J,I) - YI*ZI(J,I))          
  5618.             ZI(J,I) = SI                  
  5619.   165    CONTINUE      
  5620. C                      
  5621.   170 CONTINUE         
  5622. C     .......... STORE ROOTS ISOLATED BY CBAL ..........     
  5623.   180 DO 200 I = 1, N                     
  5624.          IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200          
  5625.          WR(I) = HR(I,I)                  
  5626.          WI(I) = HI(I,I)                  
  5627.   200 CONTINUE         
  5628. C                      
  5629.       EN = IGH         
  5630.       TR = 0.0D0       
  5631.       TI = 0.0D0       
  5632.       ITN = 30*N       
  5633. C     .......... SEARCH FOR NEXT EIGENVALUE ..........       
  5634.   220 IF (EN .LT. LOW) GO TO 680          
  5635.       ITS = 0          
  5636.       ENM1 = EN - 1    
  5637. C     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT  
  5638. C                FOR L=EN STEP -1 UNTIL LOW DO -- .......... 
  5639.   240 DO 260 LL = LOW, EN                 
  5640.          L = EN + LOW - LL                
  5641.          IF (L .EQ. LOW) GO TO 300        
  5642. C*****                 
  5643.          XR = FLOP(DABS(HR(L-1,L-1)) + DABS(HI(L-1,L-1))     
  5644.      X             + DABS(HR(L,L)) +DABS(HI(L,L)))           
  5645.          YR = FLOP(XR + DABS(HR(L,L-1)))  
  5646.          IF (XR .EQ. YR) GO TO 300        
  5647. C*****                 
  5648.   260 CONTINUE         
  5649. C     .......... FORM SHIFT ..........    
  5650.   300 IF (L .EQ. EN) GO TO 660            
  5651.       IF (ITN .EQ. 0) GO TO 1000          
  5652.       IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320            
  5653.       SR = HR(EN,EN)   
  5654.       SI = HI(EN,EN)   
  5655.       XR = FLOP(HR(ENM1,EN)*HR(EN,ENM1))  
  5656.       XI = FLOP(HI(ENM1,EN)*HR(EN,ENM1))  
  5657.       IF (XR .EQ. 0.0D0 .AND. XI .EQ. 0.0D0) GO TO 340       
  5658.       YR = FLOP((HR(ENM1,ENM1) - SR)/2.0D0)                  
  5659.       YI = FLOP((HI(ENM1,ENM1) - SI)/2.0D0)                  
  5660.       CALL WSQRT(YR**2-YI**2+XR,2.0D0*YR*YI+XI,ZZR,ZZI)      
  5661.       IF (YR*ZZR + YI*ZZI .GE. 0.0D0) GO TO 310              
  5662.       ZZR = -ZZR       
  5663.       ZZI = -ZZI       
  5664.   310 CALL WDIV(XR,XI,YR+ZZR,YI+ZZI,ZZR,ZZI)                 
  5665.       SR = FLOP(SR - ZZR)                 
  5666.       SI = FLOP(SI - ZZI)                 
  5667.       GO TO 340        
  5668. C     .......... FORM EXCEPTIONAL SHIFT ..........           
  5669.   320 SR = FLOP(DABS(HR(EN,ENM1)) + DABS(HR(ENM1,EN-2)))     
  5670.       SI = 0.0D0       
  5671. C                      
  5672.   340 DO 360 I = LOW, EN                  
  5673.          HR(I,I) = FLOP(HR(I,I) - SR)     
  5674.          HI(I,I) = FLOP(HI(I,I) - SI)     
  5675.   360 CONTINUE         
  5676. C                      
  5677.       TR = FLOP(TR + SR)                  
  5678.       TI = FLOP(TI + SI)                  
  5679.       ITS = ITS + 1    
  5680.       ITN = ITN - 1    
  5681. C     .......... REDUCE TO TRIANGLE (ROWS) ..........        
  5682.       LP1 = L + 1      
  5683. C                      
  5684.       DO 500 I = LP1, EN                  
  5685.          SR = HR(I,I-1)                   
  5686.          HR(I,I-1) = 0.0D0                
  5687.          NORM = FLOP(DABS(HR(I-1,I-1)) + DABS(HI(I-1,I-1)) + DABS(SR))          
  5688.          NORM = FLOP(NORM*DSQRT((HR(I-1,I-1)/NORM)**2 +      
  5689.      X  (HI(I-1,I-1)/NORM)**2 + (SR/NORM)**2))               
  5690.          XR = FLOP(HR(I-1,I-1)/NORM)      
  5691.          WR(I-1) = XR                     
  5692.          XI = FLOP(HI(I-1,I-1)/NORM)      
  5693.          WI(I-1) = XI                     
  5694.          HR(I-1,I-1) = NORM               
  5695.          HI(I-1,I-1) = 0.0D0              
  5696.          HI(I,I-1) = FLOP(SR/NORM)        
  5697. C                      
  5698.          DO 490 J = I, N                  
  5699.             YR = HR(I-1,J)                
  5700.             YI = HI(I-1,J)                
  5701.             ZZR = HR(I,J)                 
  5702.             ZZI = HI(I,J)                 
  5703.             HR(I-1,J) = FLOP(XR*YR + XI*YI + HI(I,I-1)*ZZR)  
  5704.             HI(I-1,J) = FLOP(XR*YI - XI*YR + HI(I,I-1)*ZZI)  
  5705.             HR(I,J) = FLOP(XR*ZZR - XI*ZZI - HI(I,I-1)*YR)   
  5706.             HI(I,J) = FLOP(XR*ZZI + XI*ZZR - HI(I,I-1)*YI)   
  5707.   490    CONTINUE      
  5708. C                      
  5709.   500 CONTINUE         
  5710. C                      
  5711.       SI = HI(EN,EN)   
  5712.       IF (SI .EQ. 0.0D0) GO TO 540        
  5713.       NORM = PYTHAG(HR(EN,EN),SI)         
  5714.       SR = FLOP(HR(EN,EN)/NORM)           
  5715.       SI = FLOP(SI/NORM)                  
  5716.       HR(EN,EN) = NORM                    
  5717.       HI(EN,EN) = 0.0D0                   
  5718.       IF (EN .EQ. N) GO TO 540            
  5719.       IP1 = EN + 1     
  5720. C                      
  5721.       DO 520 J = IP1, N                   
  5722.          YR = HR(EN,J)                    
  5723.          YI = HI(EN,J)                    
  5724.          HR(EN,J) = FLOP(SR*YR + SI*YI)   
  5725.          HI(EN,J) = FLOP(SR*YI - SI*YR)   
  5726.   520 CONTINUE         
  5727. C     .......... INVERSE OPERATION (COLUMNS) ..........      
  5728.   540 DO 600 J = LP1, EN                  
  5729.          XR = WR(J-1)                     
  5730.          XI = WI(J-1)                     
  5731. C                      
  5732.          DO 580 I = 1, J                  
  5733.             YR = HR(I,J-1)                
  5734.             YI = 0.0D0                    
  5735.             ZZR = HR(I,J)                 
  5736.             ZZI = HI(I,J)                 
  5737.             IF (I .EQ. J) GO TO 560       
  5738.             YI = HI(I,J-1)                
  5739.             HI(I,J-1) = FLOP(XR*YI + XI*YR + HI(J,J-1)*ZZI)  
  5740.   560       HR(I,J-1) = FLOP(XR*YR - XI*YI + HI(J,J-1)*ZZR)  
  5741.             HR(I,J) = FLOP(XR*ZZR + XI*ZZI - HI(J,J-1)*YR)   
  5742.             HI(I,J) = FLOP(XR*ZZI - XI*ZZR - HI(J,J-1)*YI)   
  5743.   580    CONTINUE      
  5744. C*****                 
  5745.          IF (JOB .EQ. 0) GO TO 600        
  5746. C*****                 
  5747.          DO 590 I = LOW, IGH              
  5748.             YR = ZR(I,J-1)                
  5749.             YI = ZI(I,J-1)                
  5750.             ZZR = ZR(I,J)                 
  5751.             ZZI = ZI(I,J)                 
  5752.             ZR(I,J-1) = FLOP(XR*YR - XI*YI + HI(J,J-1)*ZZR)  
  5753.             ZI(I,J-1) = FLOP(XR*YI + XI*YR + HI(J,J-1)*ZZI)  
  5754.             ZR(I,J) = FLOP(XR*ZZR + XI*ZZI - HI(J,J-1)*YR)   
  5755.             ZI(I,J) = FLOP(XR*ZZI - XI*ZZR - HI(J,J-1)*YI)   
  5756.   590    CONTINUE      
  5757. C                      
  5758.   600 CONTINUE         
  5759. C                      
  5760.       IF (SI .EQ. 0.0D0) GO TO 240        
  5761. C                      
  5762.       DO 630 I = 1, EN                    
  5763.          YR = HR(I,EN)                    
  5764.          YI = HI(I,EN)                    
  5765.          HR(I,EN) = FLOP(SR*YR - SI*YI)   
  5766.          HI(I,EN) = FLOP(SR*YI + SI*YR)   
  5767.   630 CONTINUE         
  5768. C*****                 
  5769.       IF (JOB .EQ. 0) GO TO 240           
  5770. C*****                 
  5771.       DO 640 I = LOW, IGH                 
  5772.          YR = ZR(I,EN)                    
  5773.          YI = ZI(I,EN)                    
  5774.          ZR(I,EN) = FLOP(SR*YR - SI*YI)   
  5775.          ZI(I,EN) = FLOP(SR*YI + SI*YR)   
  5776.   640 CONTINUE         
  5777. C                      
  5778.       GO TO 240        
  5779. C     .......... A ROOT FOUND ..........  
  5780.   660 HR(EN,EN) = FLOP(HR(EN,EN) + TR)    
  5781.       WR(EN) = HR(EN,EN)                  
  5782.       HI(EN,EN) = FLOP(HI(EN,EN) + TI)    
  5783.       WI(EN) = HI(EN,EN)                  
  5784.       EN = ENM1        
  5785.       GO TO 220        
  5786. C     .......... ALL ROOTS FOUND.  BACKSUBSTITUTE TO FIND    
  5787. C                VECTORS OF UPPER TRIANGULAR FORM .......... 
  5788. C                      
  5789. C*****  THE FOLLOWING SECTION CHANGED FOR OVERFLOW CONTROL   
  5790. C       C. MOLER, 3/16/82                 
  5791. C                      
  5792.   680 IF (JOB .NE. 2) GO TO 1001          
  5793. C                      
  5794.       NORM = 0.0D0     
  5795.       DO 720 I = 1, N                     
  5796.          DO 720 J = I, N                  
  5797.             TR = FLOP(DABS(HR(I,J))) + FLOP(DABS(HI(I,J)))   
  5798.             IF (TR .GT. NORM) NORM = TR   
  5799.   720 CONTINUE         
  5800.       IF (N .EQ. 1 .OR. NORM .EQ. 0.0D0) GO TO 1001          
  5801. C     .......... FOR EN=N STEP -1 UNTIL 2 DO -- ..........   
  5802.       DO 800 NN = 2, N                    
  5803.          EN = N + 2 - NN                  
  5804.          XR = WR(EN)   
  5805.          XI = WI(EN)   
  5806.          HR(EN,EN) = 1.0D0                
  5807.          HI(EN,EN) = 0.0D0                
  5808.          ENM1 = EN - 1                    
  5809. C     .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- .......... 
  5810.          DO 780 II = 1, ENM1              
  5811.             I = EN - II                   
  5812.             ZZR = 0.0D0                   
  5813.             ZZI = 0.0D0                   
  5814.             IP1 = I + 1                   
  5815.             DO 740 J = IP1, EN            
  5816.                ZZR = FLOP(ZZR + HR(I,J)*HR(J,EN) - HI(I,J)*HI(J,EN))            
  5817.                ZZI = FLOP(ZZI + HR(I,J)*HI(J,EN) + HI(I,J)*HR(J,EN))            
  5818.   740       CONTINUE   
  5819.             YR = FLOP(XR - WR(I))         
  5820.             YI = FLOP(XI - WI(I))         
  5821.             IF (YR .NE. 0.0D0 .OR. YI .NE. 0.0D0) GO TO 765  
  5822.                YR = NORM                  
  5823.   760          YR = FLOP(YR/100.0D0)      
  5824.                YI = FLOP(NORM + YR)       
  5825.                IF (YI .NE. NORM) GO TO 760                   
  5826.                YI = 0.0D0                 
  5827.   765       CONTINUE   
  5828.             CALL WDIV(ZZR,ZZI,YR,YI,HR(I,EN),HI(I,EN))       
  5829.             TR = FLOP(DABS(HR(I,EN))) + FLOP(DABS(HI(I,EN))) 
  5830.             IF (TR .EQ. 0.0D0) GO TO 780  
  5831.             IF (TR + 1.0D0/TR .GT. TR) GO TO 780             
  5832.             DO 770 J = I, EN              
  5833.                HR(J,EN) = FLOP(HR(J,EN)/TR)                  
  5834.                HI(J,EN) = FLOP(HI(J,EN)/TR)                  
  5835.   770       CONTINUE   
  5836.   780    CONTINUE      
  5837. C                      
  5838.   800 CONTINUE         
  5839. C*****                 
  5840. C     .......... END BACKSUBSTITUTION ..........             
  5841.       ENM1 = N - 1     
  5842. C     .......... VECTORS OF ISOLATED ROOTS ..........        
  5843.       DO  840 I = 1, ENM1                 
  5844.          IF (I .GE. LOW .AND. I .LE. IGH) GO TO 840          
  5845.          IP1 = I + 1   
  5846. C                      
  5847.          DO 820 J = IP1, N                
  5848.             ZR(I,J) = HR(I,J)             
  5849.             ZI(I,J) = HI(I,J)             
  5850.   820    CONTINUE      
  5851. C                      
  5852.   840 CONTINUE         
  5853. C     .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVE   
  5854. C                VECTORS OF ORIGINAL FULL MATRIX.            
  5855. C                FOR J=N STEP -1 UNTIL LOW+1 DO -- ..........                   
  5856.       DO 880 JJ = LOW, ENM1               
  5857.          J = N + LOW - JJ                 
  5858.          M = MIN0(J,IGH)                  
  5859. C                      
  5860.          DO 880 I = LOW, IGH              
  5861.             ZZR = 0.0D0                   
  5862.             ZZI = 0.0D0                   
  5863. C                      
  5864.             DO 860 K = LOW, M             
  5865.                ZZR = FLOP(ZZR + ZR(I,K)*HR(K,J) - ZI(I,K)*HI(K,J))              
  5866.                ZZI = FLOP(ZZI + ZR(I,K)*HI(K,J) + ZI(I,K)*HR(K,J))              
  5867.   860       CONTINUE   
  5868. C                      
  5869.             ZR(I,J) = ZZR                 
  5870.             ZI(I,J) = ZZI                 
  5871.   880 CONTINUE         
  5872. C                      
  5873.       GO TO 1001       
  5874. C     .......... SET ERROR -- NO CONVERGENCE TO AN           
  5875. C                EIGENVALUE AFTER 30 ITERATIONS ..........   
  5876.  1000 IERR = EN        
  5877.  1001 RETURN           
  5878.       END              
  5879.       SUBROUTINE WSVDC(XR,XI,LDX,N,P,SR,SI,ER,EI,UR,UI,LDU,VR,VI,LDV,           
  5880.      *                 WORKR,WORKI,JOB,INFO)                 
  5881.       INTEGER LDX,N,P,LDU,LDV,JOB,INFO    
  5882.       DOUBLE PRECISION XR(LDX,1),XI(LDX,1),SR(1),SI(1),ER(1),EI(1),             
  5883.      *                 UR(LDU,1),UI(LDU,1),VR(LDV,1),VI(LDV,1),                 
  5884.      *                 WORKR(1),WORKI(1)  
  5885. C                      
  5886. C                      
  5887. C     WSVDC IS A SUBROUTINE TO REDUCE A DOUBLE-COMPLEX NXP MATRIX X BY          
  5888. C     UNITARY TRANSFORMATIONS U AND V TO DIAGONAL FORM.  THE 
  5889. C     DIAGONAL ELEMENTS S(I) ARE THE SINGULAR VALUES OF X.  THE                 
  5890. C     COLUMNS OF U ARE THE CORRESPONDING LEFT SINGULAR VECTORS,                 
  5891. C     AND THE COLUMNS OF V THE RIGHT SINGULAR VECTORS.       
  5892. C                      
  5893. C     ON ENTRY         
  5894. C                      
  5895. C         X         DOUBLE-COMPLEX(LDX,P), WHERE LDX.GE.N.   
  5896. C                   X CONTAINS THE MATRIX WHOSE SINGULAR VALUE                  
  5897. C                   DECOMPOSITION IS TO BE COMPUTED.  X IS   
  5898. C                   DESTROYED BY WSVDC.   
  5899. C                      
  5900. C         LDX       INTEGER.              
  5901. C                   LDX IS THE LEADING DIMENSION OF THE ARRAY X.                
  5902. C                      
  5903. C         N         INTEGER.              
  5904. C                   N IS THE NUMBER OF COLUMNS OF THE MATRIX X.                 
  5905. C                      
  5906. C         P         INTEGER.              
  5907. C                   P IS THE NUMBER OF ROWS OF THE MATRIX X. 
  5908. C                      
  5909. C         LDU       INTEGER.              
  5910. C                   LDU IS THE LEADING DIMENSION OF THE ARRAY U                 
  5911. C                   (SEE BELOW).          
  5912. C                      
  5913. C         LDV       INTEGER.              
  5914. C                   LDV IS THE LEADING DIMENSION OF THE ARRAY V                 
  5915. C                   (SEE BELOW).          
  5916. C                      
  5917. C         WORK      DOUBLE-COMPLEX(N).    
  5918. C                   WORK IS A SCRATCH ARRAY.                 
  5919. C                      
  5920. C         JOB       INTEGER.              
  5921. C                   JOB CONTROLS THE COMPUTATION OF THE SINGULAR                
  5922. C                   VECTORS.  IT HAS THE DECIMAL EXPANSION AB                   
  5923. C                   WITH THE FOLLOWING MEANING               
  5924. C                      
  5925. C     A.EQ.0    DO NOT COMPUTE THE LEFT SINGULAR             
  5926. C               VECTORS.                  
  5927. C     A.EQ.1    RETURN THE N LEFT SINGULAR VECTORS           
  5928. C               IN U.  
  5929. C     A.GE.2    RETURNS THE FIRST MIN(N,P)                   
  5930. C               LEFT SINGULAR VECTORS IN U.                  
  5931. C     B.EQ.0    DO NOT COMPUTE THE RIGHT SINGULAR            
  5932. C               VECTORS.                  
  5933. C     B.EQ.1    RETURN THE RIGHT SINGULAR VECTORS            
  5934. C               IN V.  
  5935. C                      
  5936. C     ON RETURN        
  5937. C                      
  5938. C         S         DOUBLE-COMPLEX(MM), WHERE MM=MIN(N+1,P). 
  5939. C                   THE FIRST MIN(N,P) ENTRIES OF S CONTAIN THE                 
  5940. C                   SINGULAR VALUES OF X ARRANGED IN DESCENDING                 
  5941. C                   ORDER OF MAGNITUDE.   
  5942. C                      
  5943. C         E         DOUBLE-COMPLEX(P).    
  5944. C                   E ORDINARILY CONTAINS ZEROS.  HOWEVER SEE THE               
  5945. C                   DISCUSSION OF INFO FOR EXCEPTIONS.       
  5946. C                      
  5947. C         U         DOUBLE-COMPLEX(LDU,K), WHERE LDU.GE.N.   
  5948. C                   IF JOBA.EQ.1 THEN K.EQ.N,                
  5949. C                   IF JOBA.EQ.2 THEN K.EQ.MIN(N,P).         
  5950. C                   U CONTAINS THE MATRIX OF RIGHT SINGULAR VECTORS.            
  5951. C                   U IS NOT REFERENCED IF JOBA.EQ.0.  IF N.LE.P                
  5952. C                   OR IF JOBA.GT.2, THEN U MAY BE IDENTIFIED WITH X            
  5953. C                   IN THE SUBROUTINE CALL.                  
  5954. C                      
  5955. C         V         DOUBLE-COMPLEX(LDV,P), WHERE LDV.GE.P.   
  5956. C                   V CONTAINS THE MATRIX OF RIGHT SINGULAR VECTORS.            
  5957. C                   V IS NOT REFERENCED IF JOBB.EQ.0.  IF P.LE.N,               
  5958. C                   THEN V MAY BE IDENTIFIED WHTH X IN THE   
  5959. C                   SUBROUTINE CALL.      
  5960. C                      
  5961. C         INFO      INTEGER.              
  5962. C                   THE SINGULAR VALUES (AND THEIR CORRESPONDING                
  5963. C                   SINGULAR VECTORS) S(INFO+1),S(INFO+2),...,S(M)              
  5964. C                   ARE CORRECT (HERE M=MIN(N,P)).  THUS IF  
  5965. C                   INFO.EQ.0, ALL THE SINGULAR VALUES AND THEIR                
  5966. C                   VECTORS ARE CORRECT.  IN ANY EVENT, THE MATRIX              
  5967. C                   B = CTRANS(U)*X*V IS THE BIDIAGONAL MATRIX                  
  5968. C                   WITH THE ELEMENTS OF S ON ITS DIAGONAL AND THE              
  5969. C                   ELEMENTS OF E ON ITS SUPER-DIAGONAL (CTRANS(U)              
  5970. C                   IS THE CONJUGATE-TRANSPOSE OF U).  THUS THE                 
  5971. C                   SINGULAR VALUES OF X AND B ARE THE SAME. 
  5972. C                      
  5973. C     LINPACK. THIS VERSION DATED 07/03/79 .                 
  5974. C     G.W. STEWART, UNIVERSITY OF MARYLAND, ARGONNE NATIONAL LAB.               
  5975. C                      
  5976. C     WSVDC USES THE FOLLOWING FUNCTIONS AND SUBPROGRAMS.    
  5977. C                      
  5978. C     BLAS WAXPY,PYTHAG,WDOTCR,WDOTCI,WSCAL,WSWAP,WNRM2,RROTG                   
  5979. C     FORTRAN DABS,DIMAG,DMAX1            
  5980. C     FORTRAN MAX0,MIN0,MOD,DSQRT         
  5981. C                      
  5982. C     INTERNAL VARIABLES                  
  5983. C                      
  5984.       INTEGER I,ITER,J,JOBU,K,KASE,KK,L,LL,LLS,LM1,LP1,LS,LU,M,MAXIT,           
  5985.      *        MM,MM1,MP1,NCT,NCTP1,NCU,NRT,NRTP1             
  5986.       DOUBLE PRECISION PYTHAG,WDOTCR,WDOTCI,TR,TI,RR,RI      
  5987.       DOUBLE PRECISION B,C,CS,EL,EMM1,F,G,WNRM2,SCALE,SHIFT,SL,SM,SN,           
  5988.      *                 SMM1,T1,TEST,ZTEST,SMALL,FLOP         
  5989.       LOGICAL WANTU,WANTV                 
  5990. C                      
  5991.       DOUBLE PRECISION ZDUMR,ZDUMI        
  5992.       DOUBLE PRECISION CABS1              
  5993.       CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI)         
  5994. C                      
  5995. C     SET THE MAXIMUM NUMBER OF ITERATIONS.                  
  5996. C                      
  5997.       MAXIT = 75       
  5998. C                      
  5999. C     SMALL NUMBER, ROUGHLY MACHINE EPSILON, USED TO AVOID UNDERFLOW            
  6000. C                      
  6001.       SMALL = 1.D0/2.D0**48               
  6002. C                      
  6003. C     DETERMINE WHAT IS TO BE COMPUTED.   
  6004. C                      
  6005.       WANTU = .FALSE.                     
  6006.       WANTV = .FALSE.                     
  6007.       JOBU = MOD(JOB,100)/10              
  6008.       NCU = N          
  6009.       IF (JOBU .GT. 1) NCU = MIN0(N,P)    
  6010.       IF (JOBU .NE. 0) WANTU = .TRUE.     
  6011.       IF (MOD(JOB,10) .NE. 0) WANTV = .TRUE.                 
  6012. C                      
  6013. C     REDUCE X TO BIDIAGONAL FORM, STORING THE DIAGONAL ELEMENTS                
  6014. C     IN S AND THE SUPER-DIAGONAL ELEMENTS IN E.             
  6015. C                      
  6016.       INFO = 0         
  6017.       NCT = MIN0(N-1,P)                   
  6018.       NRT = MAX0(0,MIN0(P-2,N))           
  6019.       LU = MAX0(NCT,NRT)                  
  6020.       IF (LU .LT. 1) GO TO 190            
  6021.       DO 180 L = 1, LU                    
  6022.          LP1 = L + 1   
  6023.          IF (L .GT. NCT) GO TO 30         
  6024. C                      
  6025. C           COMPUTE THE TRANSFORMATION FOR THE L-TH COLUMN AND                  
  6026. C           PLACE THE L-TH DIAGONAL IN S(L).                 
  6027. C                      
  6028.             SR(L) = WNRM2(N-L+1,XR(L,L),XI(L,L),1)           
  6029.             SI(L) = 0.0D0                 
  6030.             IF (CABS1(SR(L),SI(L)) .EQ. 0.0D0) GO TO 20      
  6031.                IF (CABS1(XR(L,L),XI(L,L)) .EQ. 0.0D0) GO TO 10                  
  6032.                   CALL WSIGN(SR(L),SI(L),XR(L,L),XI(L,L),SR(L),SI(L))           
  6033.    10          CONTINUE                   
  6034.                CALL WDIV(1.0D0,0.0D0,SR(L),SI(L),TR,TI)      
  6035.                CALL WSCAL(N-L+1,TR,TI,XR(L,L),XI(L,L),1)     
  6036.                XR(L,L) = FLOP(1.0D0 + XR(L,L))               
  6037.    20       CONTINUE   
  6038.             SR(L) = -SR(L)                
  6039.             SI(L) = -SI(L)                
  6040.    30    CONTINUE      
  6041.          IF (P .LT. LP1) GO TO 60         
  6042.          DO 50 J = LP1, P                 
  6043.             IF (L .GT. NCT) GO TO 40      
  6044.             IF (CABS1(SR(L),SI(L)) .EQ. 0.0D0) GO TO 40      
  6045. C                      
  6046. C              APPLY THE TRANSFORMATION.  
  6047. C                      
  6048.                TR = -WDOTCR(N-L+1,XR(L,L),XI(L,L),1,XR(L,J),XI(L,J),1)          
  6049.                TI = -WDOTCI(N-L+1,XR(L,L),XI(L,L),1,XR(L,J),XI(L,J),1)          
  6050.                CALL WDIV(TR,TI,XR(L,L),XI(L,L),TR,TI)        
  6051.                CALL WAXPY(N-L+1,TR,TI,XR(L,L),XI(L,L),1,XR(L,J),                
  6052.      * XI(L,J),1)      
  6053.    40       CONTINUE   
  6054. C                      
  6055. C           PLACE THE L-TH ROW OF X INTO  E FOR THE          
  6056. C           SUBSEQUENT CALCULATION OF THE ROW TRANSFORMATION.                   
  6057. C                      
  6058.             ER(J) = XR(L,J)               
  6059.             EI(J) = -XI(L,J)              
  6060.    50    CONTINUE      
  6061.    60    CONTINUE      
  6062.          IF (.NOT.WANTU .OR. L .GT. NCT) GO TO 80            
  6063. C                      
  6064. C           PLACE THE TRANSFORMATION IN U FOR SUBSEQUENT BACK                   
  6065. C           MULTIPLICATION.               
  6066. C                      
  6067.             DO 70 I = L, N                
  6068.                UR(I,L) = XR(I,L)          
  6069.                UI(I,L) = XI(I,L)          
  6070.    70       CONTINUE   
  6071.    80    CONTINUE      
  6072.          IF (L .GT. NRT) GO TO 170        
  6073. C                      
  6074. C           COMPUTE THE L-TH ROW TRANSFORMATION AND PLACE THE                   
  6075. C           L-TH SUPER-DIAGONAL IN E(L).  
  6076. C                      
  6077.             ER(L) = WNRM2(P-L,ER(LP1),EI(LP1),1)             
  6078.             EI(L) = 0.0D0                 
  6079.             IF (CABS1(ER(L),EI(L)) .EQ. 0.0D0) GO TO 100     
  6080.                IF (CABS1(ER(LP1),EI(LP1)) .EQ. 0.0D0) GO TO 90                  
  6081.                   CALL WSIGN(ER(L),EI(L),ER(LP1),EI(LP1),ER(L),EI(L))           
  6082.    90          CONTINUE                   
  6083.                CALL WDIV(1.0D0,0.0D0,ER(L),EI(L),TR,TI)      
  6084.                CALL WSCAL(P-L,TR,TI,ER(LP1),EI(LP1),1)       
  6085.                ER(LP1) = FLOP(1.0D0 + ER(LP1))               
  6086.   100       CONTINUE   
  6087.             ER(L) = -ER(L)                
  6088.             EI(L) = +EI(L)                
  6089.             IF (LP1 .GT. N .OR. CABS1(ER(L),EI(L)) .EQ. 0.0D0)                  
  6090.      *         GO TO 140                  
  6091. C                      
  6092. C              APPLY THE TRANSFORMATION.  
  6093. C                      
  6094.                DO 110 I = LP1, N          
  6095.                   WORKR(I) = 0.0D0        
  6096.                   WORKI(I) = 0.0D0        
  6097.   110          CONTINUE                   
  6098.                DO 120 J = LP1, P          
  6099.                   CALL WAXPY(N-L,ER(J),EI(J),XR(LP1,J),XI(LP1,J),1,             
  6100.      *    WORKR(LP1),WORKI(LP1),1)        
  6101.   120          CONTINUE                   
  6102.                DO 130 J = LP1, P          
  6103.                   CALL WDIV(-ER(J),-EI(J),ER(LP1),EI(LP1),TR,TI)                
  6104.                   CALL WAXPY(N-L,TR,-TI,WORKR(LP1),WORKI(LP1),1,                
  6105.      *    XR(LP1,J),XI(LP1,J),1)          
  6106.   130          CONTINUE                   
  6107.   140       CONTINUE   
  6108.             IF (.NOT.WANTV) GO TO 160     
  6109. C                      
  6110. C              PLACE THE TRANSFORMATION IN V FOR SUBSEQUENT  
  6111. C              BACK MULTIPLICATION.       
  6112. C                      
  6113.                DO 150 I = LP1, P          
  6114.                   VR(I,L) = ER(I)         
  6115.                   VI(I,L) = EI(I)         
  6116.   150          CONTINUE                   
  6117.   160       CONTINUE   
  6118.   170    CONTINUE      
  6119.   180 CONTINUE         
  6120.   190 CONTINUE         
  6121. C                      
  6122. C     SET UP THE FINAL BIDIAGONAL MATRIX OR ORDER M.         
  6123. C                      
  6124.       M = MIN0(P,N+1)                     
  6125.       NCTP1 = NCT + 1                     
  6126.       NRTP1 = NRT + 1                     
  6127.       IF (NCT .GE. P) GO TO 200           
  6128.          SR(NCTP1) = XR(NCTP1,NCTP1)      
  6129.          SI(NCTP1) = XI(NCTP1,NCTP1)      
  6130.   200 CONTINUE         
  6131.       IF (N .GE. M) GO TO 210             
  6132.          SR(M) = 0.0D0                    
  6133.          SI(M) = 0.0D0                    
  6134.   210 CONTINUE         
  6135.       IF (NRTP1 .GE. M) GO TO 220         
  6136.          ER(NRTP1) = XR(NRTP1,M)          
  6137.          EI(NRTP1) = XI(NRTP1,M)          
  6138.   220 CONTINUE         
  6139.       ER(M) = 0.0D0    
  6140.       EI(M) = 0.0D0    
  6141. C                      
  6142. C     IF REQUIRED, GENERATE U.            
  6143. C                      
  6144.       IF (.NOT.WANTU) GO TO 350           
  6145.          IF (NCU .LT. NCTP1) GO TO 250    
  6146.          DO 240 J = NCTP1, NCU            
  6147.             DO 230 I = 1, N               
  6148.                UR(I,J) = 0.0D0            
  6149.                UI(I,J) = 0.0D0            
  6150.   230       CONTINUE   
  6151.             UR(J,J) = 1.0D0               
  6152.             UI(J,J) = 0.0D0               
  6153.   240    CONTINUE      
  6154.   250    CONTINUE      
  6155.          IF (NCT .LT. 1) GO TO 340        
  6156.          DO 330 LL = 1, NCT               
  6157.             L = NCT - LL + 1              
  6158.             IF (CABS1(SR(L),SI(L)) .EQ. 0.0D0) GO TO 300     
  6159.                LP1 = L + 1                
  6160.                IF (NCU .LT. LP1) GO TO 270                   
  6161.                DO 260 J = LP1, NCU        
  6162.                   TR = -WDOTCR(N-L+1,UR(L,L),UI(L,L),1,UR(L,J),                 
  6163.      *      UI(L,J),1)                    
  6164.                   TI = -WDOTCI(N-L+1,UR(L,L),UI(L,L),1,UR(L,J),                 
  6165.      *      UI(L,J),1)                    
  6166.                   CALL WDIV(TR,TI,UR(L,L),UI(L,L),TR,TI)     
  6167.                   CALL WAXPY(N-L+1,TR,TI,UR(L,L),UI(L,L),1,UR(L,J),             
  6168.      *    UI(L,J),1)   
  6169.   260          CONTINUE                   
  6170.   270          CONTINUE                   
  6171.                CALL WRSCAL(N-L+1,-1.0D0,UR(L,L),UI(L,L),1)   
  6172.                UR(L,L) = FLOP(1.0D0 + UR(L,L))               
  6173.                LM1 = L - 1                
  6174.                IF (LM1 .LT. 1) GO TO 290  
  6175.                DO 280 I = 1, LM1          
  6176.                   UR(I,L) = 0.0D0         
  6177.                   UI(I,L) = 0.0D0         
  6178.   280          CONTINUE                   
  6179.   290          CONTINUE                   
  6180.             GO TO 320                     
  6181.   300       CONTINUE   
  6182.                DO 310 I = 1, N            
  6183.                   UR(I,L) = 0.0D0         
  6184.                   UI(I,L) = 0.0D0         
  6185.   310          CONTINUE                   
  6186.                UR(L,L) = 1.0D0            
  6187.                UI(L,L) = 0.0D0            
  6188.   320       CONTINUE   
  6189.   330    CONTINUE      
  6190.   340    CONTINUE      
  6191.   350 CONTINUE         
  6192. C                      
  6193. C     IF IT IS REQUIRED, GENERATE V.      
  6194. C                      
  6195.       IF (.NOT.WANTV) GO TO 400           
  6196.          DO 390 LL = 1, P                 
  6197.             L = P - LL + 1                
  6198.             LP1 = L + 1                   
  6199.             IF (L .GT. NRT) GO TO 370     
  6200.             IF (CABS1(ER(L),EI(L)) .EQ. 0.0D0) GO TO 370     
  6201.                DO 360 J = LP1, P          
  6202.                   TR = -WDOTCR(P-L,VR(LP1,L),VI(LP1,L),1,VR(LP1,J),             
  6203.      *      VI(LP1,J),1)                  
  6204.                   TI = -WDOTCI(P-L,VR(LP1,L),VI(LP1,L),1,VR(LP1,J),             
  6205.      *      VI(LP1,J),1)                  
  6206.                   CALL WDIV(TR,TI,VR(LP1,L),VI(LP1,L),TR,TI) 
  6207.                   CALL WAXPY(P-L,TR,TI,VR(LP1,L),VI(LP1,L),1,VR(LP1,J),         
  6208.      *    VI(LP1,J),1)                    
  6209.   360          CONTINUE                   
  6210.   370       CONTINUE   
  6211.             DO 380 I = 1, P               
  6212.                VR(I,L) = 0.0D0            
  6213.                VI(I,L) = 0.0D0            
  6214.   380       CONTINUE   
  6215.             VR(L,L) = 1.0D0               
  6216.             VI(L,L) = 0.0D0               
  6217.   390    CONTINUE      
  6218.   400 CONTINUE         
  6219. C                      
  6220. C     TRANSFORM S AND E SO THAT THEY ARE REAL.               
  6221. C                      
  6222.       DO 420 I = 1, M                     
  6223.             TR = PYTHAG(SR(I),SI(I))      
  6224.             IF (TR .EQ. 0.0D0) GO TO 405  
  6225.             RR = SR(I)/TR                 
  6226.             RI = SI(I)/TR                 
  6227.             SR(I) = TR                    
  6228.             SI(I) = 0.0D0                 
  6229.             IF (I .LT. M) CALL WDIV(ER(I),EI(I),RR,RI,ER(I),EI(I))              
  6230.             IF (WANTU) CALL WSCAL(N,RR,RI,UR(1,I),UI(1,I),1) 
  6231.   405    CONTINUE      
  6232. C     ...EXIT          
  6233.          IF (I .EQ. M) GO TO 430          
  6234.             TR = PYTHAG(ER(I),EI(I))      
  6235.             IF (TR .EQ. 0.0D0) GO TO 410  
  6236.             CALL WDIV(TR,0.0D0,ER(I),EI(I),RR,RI)            
  6237.             ER(I) = TR                    
  6238.             EI(I) = 0.0D0                 
  6239.             CALL WMUL(SR(I+1),SI(I+1),RR,RI,SR(I+1),SI(I+1)) 
  6240.             IF (WANTV) CALL WSCAL(P,RR,RI,VR(1,I+1),VI(1,I+1),1)                
  6241.   410    CONTINUE      
  6242.   420 CONTINUE         
  6243.   430 CONTINUE         
  6244. C                      
  6245. C     MAIN ITERATION LOOP FOR THE SINGULAR VALUES.           
  6246. C                      
  6247.       MM = M           
  6248.       ITER = 0         
  6249.   440 CONTINUE         
  6250. C                      
  6251. C        QUIT IF ALL THE SINGULAR VALUES HAVE BEEN FOUND.    
  6252. C                      
  6253. C     ...EXIT          
  6254.          IF (M .EQ. 0) GO TO 700          
  6255. C                      
  6256. C        IF TOO MANY ITERATIONS HAVE BEEN PERFORMED, SET     
  6257. C        FLAG AND RETURN.                 
  6258. C                      
  6259.          IF (ITER .LT. MAXIT) GO TO 450   
  6260.             INFO = M   
  6261. C     ......EXIT       
  6262.             GO TO 700                     
  6263.   450    CONTINUE      
  6264. C                      
  6265. C        THIS SECTION OF THE PROGRAM INSPECTS FOR            
  6266. C        NEGLIGIBLE ELEMENTS IN THE S AND E ARRAYS.  ON      
  6267. C        COMPLETION THE VARIABLE KASE IS SET AS FOLLOWS.     
  6268. C                      
  6269. C           KASE = 1     IF SR(M) AND ER(L-1) ARE NEGLIGIBLE AND L.LT.M         
  6270. C           KASE = 2     IF SR(L) IS NEGLIGIBLE AND L.LT.M   
  6271. C           KASE = 3     IF ER(L-1) IS NEGLIGIBLE, L.LT.M, AND                  
  6272. C     SR(L), ..., SR(M) ARE NOT NEGLIGIBLE (QR STEP).        
  6273. C           KASE = 4     IF ER(M-1) IS NEGLIGIBLE (CONVERGENCE).                
  6274. C                      
  6275.          DO 470 LL = 1, M                 
  6276.             L = M - LL                    
  6277. C        ...EXIT       
  6278.             IF (L .EQ. 0) GO TO 480       
  6279.             TEST = FLOP(DABS(SR(L)) + DABS(SR(L+1)))         
  6280.             ZTEST = FLOP(TEST + DABS(ER(L))/2.0D0)           
  6281.             IF (SMALL*ZTEST .NE. SMALL*TEST) GO TO 460       
  6282.                ER(L) = 0.0D0              
  6283. C        ......EXIT    
  6284.                GO TO 480                  
  6285.   460       CONTINUE   
  6286.   470    CONTINUE      
  6287.   480    CONTINUE      
  6288.          IF (L .NE. M - 1) GO TO 490      
  6289.             KASE = 4   
  6290.          GO TO 560     
  6291.   490    CONTINUE      
  6292.             LP1 = L + 1                   
  6293.             MP1 = M + 1                   
  6294.             DO 510 LLS = LP1, MP1         
  6295.                LS = M - LLS + LP1         
  6296. C           ...EXIT    
  6297.                IF (LS .EQ. L) GO TO 520   
  6298.                TEST = 0.0D0               
  6299.                IF (LS .NE. M) TEST = FLOP(TEST + DABS(ER(LS)))                  
  6300.                IF (LS .NE. L + 1) TEST = FLOP(TEST + DABS(ER(LS-1)))            
  6301.                ZTEST = FLOP(TEST + DABS(SR(LS))/2.0D0)       
  6302.                IF (SMALL*ZTEST .NE. SMALL*TEST) GO TO 500    
  6303.                   SR(LS) = 0.0D0          
  6304. C           ......EXIT                    
  6305.                   GO TO 520               
  6306.   500          CONTINUE                   
  6307.   510       CONTINUE   
  6308.   520       CONTINUE   
  6309.             IF (LS .NE. L) GO TO 530      
  6310.                KASE = 3                   
  6311.             GO TO 550                     
  6312.   530       CONTINUE   
  6313.             IF (LS .NE. M) GO TO 540      
  6314.                KASE = 1                   
  6315.             GO TO 550                     
  6316.   540       CONTINUE   
  6317.                KASE = 2                   
  6318.                L = LS                     
  6319.   550       CONTINUE   
  6320.   560    CONTINUE      
  6321.          L = L + 1     
  6322. C                      
  6323. C        PERFORM THE TASK INDICATED BY KASE.                 
  6324. C                      
  6325.          GO TO (570, 600, 620, 650), KASE                    
  6326. C                      
  6327. C        DEFLATE NEGLIGIBLE SR(M).        
  6328. C                      
  6329.   570    CONTINUE      
  6330.             MM1 = M - 1                   
  6331.             F = ER(M-1)                   
  6332.             ER(M-1) = 0.0D0               
  6333.             DO 590 KK = L, MM1            
  6334.                K = MM1 - KK + L           
  6335.                T1 = SR(K)                 
  6336.                CALL RROTG(T1,F,CS,SN)     
  6337.                SR(K) = T1                 
  6338.                IF (K .EQ. L) GO TO 580    
  6339.                   F = FLOP(-SN*ER(K-1))   
  6340.                   ER(K-1) = FLOP(CS*ER(K-1))                 
  6341.   580          CONTINUE                   
  6342.                IF (WANTV) CALL RROT(P,VR(1,K),1,VR(1,M),1,CS,SN)                
  6343.                IF (WANTV) CALL RROT(P,VI(1,K),1,VI(1,M),1,CS,SN)                
  6344.   590       CONTINUE   
  6345.          GO TO 690     
  6346. C                      
  6347. C        SPLIT AT NEGLIGIBLE SR(L).       
  6348. C                      
  6349.   600    CONTINUE      
  6350.             F = ER(L-1)                   
  6351.             ER(L-1) = 0.0D0               
  6352.             DO 610 K = L, M               
  6353.                T1 = SR(K)                 
  6354.                CALL RROTG(T1,F,CS,SN)     
  6355.                SR(K) = T1                 
  6356.                F = FLOP(-SN*ER(K))        
  6357.                ER(K) = FLOP(CS*ER(K))     
  6358.                IF (WANTU) CALL RROT(N,UR(1,K),1,UR(1,L-1),1,CS,SN)              
  6359.                IF (WANTU) CALL RROT(N,UI(1,K),1,UI(1,L-1),1,CS,SN)              
  6360.   610       CONTINUE   
  6361.          GO TO 690     
  6362. C                      
  6363. C        PERFORM ONE QR STEP.             
  6364. C                      
  6365.   620    CONTINUE      
  6366. C                      
  6367. C           CALCULATE THE SHIFT.          
  6368. C                      
  6369.             SCALE = DMAX1(DABS(SR(M)),DABS(SR(M-1)),DABS(ER(M-1)),              
  6370.      * DABS(SR(L)),DABS(ER(L)))           
  6371.             SM = SR(M)/SCALE              
  6372.             SMM1 = SR(M-1)/SCALE          
  6373.             EMM1 = ER(M-1)/SCALE          
  6374.             SL = SR(L)/SCALE              
  6375.             EL = ER(L)/SCALE              
  6376.             B = FLOP(((SMM1 + SM)*(SMM1 - SM) + EMM1**2)/2.0D0)                 
  6377.             C = FLOP((SM*EMM1)**2)        
  6378.             SHIFT = 0.0D0                 
  6379.             IF (B .EQ. 0.0D0 .AND. C .EQ. 0.0D0) GO TO 630   
  6380.                SHIFT = FLOP(DSQRT(B**2+C))                   
  6381.                IF (B .LT. 0.0D0) SHIFT = -SHIFT              
  6382.                SHIFT = FLOP(C/(B + SHIFT))                   
  6383.   630       CONTINUE   
  6384.             F = FLOP((SL + SM)*(SL - SM) - SHIFT)            
  6385.             G = FLOP(SL*EL)               
  6386. C                      
  6387. C           CHASE ZEROS.                  
  6388. C                      
  6389.             MM1 = M - 1                   
  6390.             DO 640 K = L, MM1             
  6391.                CALL RROTG(F,G,CS,SN)      
  6392.                IF (K .NE. L) ER(K-1) = F  
  6393.                F = FLOP(CS*SR(K) + SN*ER(K))                 
  6394.                ER(K) = FLOP(CS*ER(K) - SN*SR(K))             
  6395.                G = FLOP(SN*SR(K+1))       
  6396.                SR(K+1) = FLOP(CS*SR(K+1))                    
  6397.                IF (WANTV) CALL RROT(P,VR(1,K),1,VR(1,K+1),1,CS,SN)              
  6398.                IF (WANTV) CALL RROT(P,VI(1,K),1,VI(1,K+1),1,CS,SN)              
  6399.                CALL RROTG(F,G,CS,SN)      
  6400.                SR(K) = F                  
  6401.                F = FLOP(CS*ER(K) + SN*SR(K+1))               
  6402.                SR(K+1) = FLOP(-SN*ER(K) + CS*SR(K+1))        
  6403.                G = FLOP(SN*ER(K+1))       
  6404.                ER(K+1) = FLOP(CS*ER(K+1))                    
  6405.                IF (WANTU .AND. K .LT. N)  
  6406.      *            CALL RROT(N,UR(1,K),1,UR(1,K+1),1,CS,SN)   
  6407.                IF (WANTU .AND. K .LT. N)  
  6408.      *            CALL RROT(N,UI(1,K),1,UI(1,K+1),1,CS,SN)   
  6409.   640       CONTINUE   
  6410.             ER(M-1) = F                   
  6411.             ITER = ITER + 1               
  6412.          GO TO 690     
  6413. C                      
  6414. C        CONVERGENCE   
  6415. C                      
  6416.   650    CONTINUE      
  6417. C                      
  6418. C           MAKE THE SINGULAR VALUE  POSITIVE                
  6419. C                      
  6420.             IF (SR(L) .GE. 0.0D0) GO TO 660                  
  6421.                SR(L) = -SR(L)             
  6422.              IF (WANTV) CALL WRSCAL(P,-1.0D0,VR(1,L),VI(1,L),1)                 
  6423.   660       CONTINUE   
  6424. C                      
  6425. C           ORDER THE SINGULAR VALUE.     
  6426. C                      
  6427.   670       IF (L .EQ. MM) GO TO 680      
  6428. C           ...EXIT    
  6429.                IF (SR(L) .GE. SR(L+1)) GO TO 680             
  6430.                TR = SR(L)                 
  6431.                SR(L) = SR(L+1)            
  6432.                SR(L+1) = TR               
  6433.                IF (WANTV .AND. L .LT. P)  
  6434.      *            CALL WSWAP(P,VR(1,L),VI(1,L),1,VR(1,L+1),VI(1,L+1),1)         
  6435.                IF (WANTU .AND. L .LT. N)  
  6436.      *            CALL WSWAP(N,UR(1,L),UI(1,L),1,UR(1,L+1),UI(1,L+1),1)         
  6437.                L = L + 1                  
  6438.             GO TO 670                     
  6439.   680       CONTINUE   
  6440.             ITER = 0   
  6441.             M = M - 1                     
  6442.   690    CONTINUE      
  6443.       GO TO 440        
  6444.   700 CONTINUE         
  6445.       RETURN           
  6446.       END              
  6447.       SUBROUTINE WQRDC(XR,XI,LDX,N,P,QRAUXR,QRAUXI,JPVT,WORKR,WORKI,            
  6448.      *                 JOB)               
  6449.       INTEGER LDX,N,P,JOB                 
  6450.       INTEGER JPVT(1)                     
  6451.       DOUBLE PRECISION XR(LDX,1),XI(LDX,1),QRAUXR(1),QRAUXI(1),                 
  6452.      *                 WORKR(1),WORKI(1)  
  6453. C                      
  6454. C     WQRDC USES HOUSEHOLDER TRANSFORMATIONS TO COMPUTE THE QR                  
  6455. C     FACTORIZATION OF AN N BY P MATRIX X.  COLUMN PIVOTING  
  6456. C     BASED ON THE 2-NORMS OF THE REDUCED COLUMNS MAY BE     
  6457. C     PERFORMED AT THE USERS OPTION.      
  6458. C                      
  6459. C     ON ENTRY         
  6460. C                      
  6461. C        X       DOUBLE-COMPLEX(LDX,P), WHERE LDX .GE. N.    
  6462. C                X CONTAINS THE MATRIX WHOSE DECOMPOSITION IS TO BE             
  6463. C                COMPUTED.                
  6464. C                      
  6465. C        LDX     INTEGER.                 
  6466. C                LDX IS THE LEADING DIMENSION OF THE ARRAY X.                   
  6467. C                      
  6468. C        N       INTEGER.                 
  6469. C                N IS THE NUMBER OF ROWS OF THE MATRIX X.    
  6470. C                      
  6471. C        P       INTEGER.                 
  6472. C                P IS THE NUMBER OF COLUMNS OF THE MATRIX X. 
  6473. C                      
  6474. C        JPVT    INTEGER(P).              
  6475. C                JPVT CONTAINS INTEGERS THAT CONTROL THE SELECTION              
  6476. C                OF THE PIVOT COLUMNS.  THE K-TH COLUMN X(K) OF X               
  6477. C                IS PLACED IN ONE OF THREE CLASSES ACCORDING TO THE             
  6478. C                VALUE OF JPVT(K).        
  6479. C                      
  6480. C                   IF JPVT(K) .GT. 0, THEN X(K) IS AN INITIAL                  
  6481. C                   COLUMN.               
  6482. C                      
  6483. C                   IF JPVT(K) .EQ. 0, THEN X(K) IS A FREE COLUMN.              
  6484. C                      
  6485. C                   IF JPVT(K) .LT. 0, THEN X(K) IS A FINAL COLUMN.             
  6486. C                      
  6487. C                BEFORE THE DECOMPOSITION IS COMPUTED, INITIAL COLUMNS          
  6488. C                ARE MOVED TO THE BEGINNING OF THE ARRAY X AND FINAL            
  6489. C                COLUMNS TO THE END.  BOTH INITIAL AND FINAL COLUMNS            
  6490. C                ARE FROZEN IN PLACE DURING THE COMPUTATION AND ONLY            
  6491. C                FREE COLUMNS ARE MOVED.  AT THE K-TH STAGE OF THE              
  6492. C                REDUCTION, IF X(K) IS OCCUPIED BY A FREE COLUMN                
  6493. C                IT IS INTERCHANGED WITH THE FREE COLUMN OF LARGEST             
  6494. C                REDUCED NORM.  JPVT IS NOT REFERENCED IF    
  6495. C                JOB .EQ. 0.              
  6496. C                      
  6497. C        WORK    DOUBLE-COMPLEX(P).       
  6498. C                WORK IS A WORK ARRAY.  WORK IS NOT REFERENCED IF               
  6499. C                JOB .EQ. 0.              
  6500. C                      
  6501. C        JOB     INTEGER.                 
  6502. C                JOB IS AN INTEGER THAT INITIATES COLUMN PIVOTING.              
  6503. C                IF JOB .EQ. 0, NO PIVOTING IS DONE.         
  6504. C                IF JOB .NE. 0, PIVOTING IS DONE.            
  6505. C                      
  6506. C     ON RETURN        
  6507. C                      
  6508. C        X       X CONTAINS IN ITS UPPER TRIANGLE THE UPPER  
  6509. C                TRIANGULAR MATRIX R OF THE QR FACTORIZATION.                   
  6510. C                BELOW ITS DIAGONAL X CONTAINS INFORMATION FROM                 
  6511. C                WHICH THE UNITARY PART OF THE DECOMPOSITION 
  6512. C                CAN BE RECOVERED.  NOTE THAT IF PIVOTING HAS                   
  6513. C                BEEN REQUESTED, THE DECOMPOSITION IS NOT THAT                  
  6514. C                OF THE ORIGINAL MATRIX X BUT THAT OF X      
  6515. C                WITH ITS COLUMNS PERMUTED AS DESCRIBED BY JPVT.                
  6516. C                      
  6517. C        QRAUX   DOUBLE-COMPLEX(P).       
  6518. C                QRAUX CONTAINS FURTHER INFORMATION REQUIRED TO RECOVER         
  6519. C                THE UNITARY PART OF THE DECOMPOSITION.      
  6520. C                      
  6521. C        JPVT    JPVT(K) CONTAINS THE INDEX OF THE COLUMN OF THE                
  6522. C                ORIGINAL MATRIX THAT HAS BEEN INTERCHANGED INTO                
  6523. C                THE K-TH COLUMN, IF PIVOTING WAS REQUESTED. 
  6524. C                      
  6525. C     LINPACK. THIS VERSION DATED 07/03/79 .                 
  6526. C     G.W. STEWART, UNIVERSITY OF MARYLAND, ARGONNE NATIONAL LAB.               
  6527. C                      
  6528. C     WQRDC USES THE FOLLOWING FUNCTIONS AND SUBPROGRAMS.    
  6529. C                      
  6530. C     BLAS WAXPY,PYTHAG,WDOTCR,WDOTCI,WSCAL,WSWAP,WNRM2      
  6531. C     FORTRAN DABS,DIMAG,DMAX1,MIN0       
  6532. C                      
  6533. C     INTERNAL VARIABLES                  
  6534. C                      
  6535.       INTEGER J,JP,L,LP1,LUP,MAXJ,PL,PU   
  6536.       DOUBLE PRECISION MAXNRM,WNRM2,TT    
  6537.       DOUBLE PRECISION PYTHAG,WDOTCR,WDOTCI,NRMXLR,NRMXLI,TR,TI,FLOP            
  6538.       LOGICAL NEGJ,SWAPJ                  
  6539. C                      
  6540.       DOUBLE PRECISION ZDUMR,ZDUMI        
  6541.       DOUBLE PRECISION CABS1              
  6542.       CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI)         
  6543. C                      
  6544.       PL = 1           
  6545.       PU = 0           
  6546.       IF (JOB .EQ. 0) GO TO 60            
  6547. C                      
  6548. C        PIVOTING HAS BEEN REQUESTED.  REARRANGE THE COLUMNS 
  6549. C        ACCORDING TO JPVT.               
  6550. C                      
  6551.          DO 20 J = 1, P                   
  6552.             SWAPJ = JPVT(J) .GT. 0        
  6553.             NEGJ = JPVT(J) .LT. 0         
  6554.             JPVT(J) = J                   
  6555.             IF (NEGJ) JPVT(J) = -J        
  6556.             IF (.NOT.SWAPJ) GO TO 10      
  6557.                IF (J .NE. PL)             
  6558.      *            CALL WSWAP(N,XR(1,PL),XI(1,PL),1,XR(1,J),XI(1,J),1)           
  6559.                JPVT(J) = JPVT(PL)         
  6560.                JPVT(PL) = J               
  6561.                PL = PL + 1                
  6562.    10       CONTINUE   
  6563.    20    CONTINUE      
  6564.          PU = P        
  6565.          DO 50 JJ = 1, P                  
  6566.             J = P - JJ + 1                
  6567.             IF (JPVT(J) .GE. 0) GO TO 40  
  6568.                JPVT(J) = -JPVT(J)         
  6569.                IF (J .EQ. PU) GO TO 30    
  6570.                   CALL WSWAP(N,XR(1,PU),XI(1,PU),1,XR(1,J),XI(1,J),1)           
  6571.                   JP = JPVT(PU)           
  6572.                   JPVT(PU) = JPVT(J)      
  6573.                   JPVT(J) = JP            
  6574.    30          CONTINUE                   
  6575.                PU = PU - 1                
  6576.    40       CONTINUE   
  6577.    50    CONTINUE      
  6578.    60 CONTINUE         
  6579. C                      
  6580. C     COMPUTE THE NORMS OF THE FREE COLUMNS.                 
  6581. C                      
  6582.       IF (PU .LT. PL) GO TO 80            
  6583.       DO 70 J = PL, PU                    
  6584.          QRAUXR(J) = WNRM2(N,XR(1,J),XI(1,J),1)              
  6585.          QRAUXI(J) = 0.0D0                
  6586.          WORKR(J) = QRAUXR(J)             
  6587.          WORKI(J) = QRAUXI(J)             
  6588.    70 CONTINUE         
  6589.    80 CONTINUE         
  6590. C                      
  6591. C     PERFORM THE HOUSEHOLDER REDUCTION OF X.                
  6592. C                      
  6593.       LUP = MIN0(N,P)                     
  6594.       DO 210 L = 1, LUP                   
  6595.          IF (L .LT. PL .OR. L .GE. PU) GO TO 120             
  6596. C                      
  6597. C           LOCATE THE COLUMN OF LARGEST NORM AND BRING IT   
  6598. C           INTO THE PIVOT POSITION.      
  6599. C                      
  6600.             MAXNRM = 0.0D0                
  6601.             MAXJ = L   
  6602.             DO 100 J = L, PU              
  6603.                IF (QRAUXR(J) .LE. MAXNRM) GO TO 90           
  6604.                   MAXNRM = QRAUXR(J)      
  6605.                   MAXJ = J                
  6606.    90          CONTINUE                   
  6607.   100       CONTINUE   
  6608.             IF (MAXJ .EQ. L) GO TO 110    
  6609.                CALL WSWAP(N,XR(1,L),XI(1,L),1,XR(1,MAXJ),XI(1,MAXJ),1)          
  6610.                QRAUXR(MAXJ) = QRAUXR(L)   
  6611.                QRAUXI(MAXJ) = QRAUXI(L)   
  6612.                WORKR(MAXJ) = WORKR(L)     
  6613.                WORKI(MAXJ) = WORKI(L)     
  6614.                JP = JPVT(MAXJ)            
  6615.                JPVT(MAXJ) = JPVT(L)       
  6616.                JPVT(L) = JP               
  6617.   110       CONTINUE   
  6618.   120    CONTINUE      
  6619.          QRAUXR(L) = 0.0D0                
  6620.          QRAUXI(L) = 0.0D0                
  6621.          IF (L .EQ. N) GO TO 200          
  6622. C                      
  6623. C           COMPUTE THE HOUSEHOLDER TRANSFORMATION FOR COLUMN L.                
  6624. C                      
  6625.             NRMXLR = WNRM2(N-L+1,XR(L,L),XI(L,L),1)          
  6626.             NRMXLI = 0.0D0                
  6627.             IF (CABS1(NRMXLR,NRMXLI) .EQ. 0.0D0) GO TO 190   
  6628.                IF (CABS1(XR(L,L),XI(L,L)) .EQ. 0.0D0) GO TO 130                 
  6629.                  CALL WSIGN(NRMXLR,NRMXLI,XR(L,L),XI(L,L),NRMXLR,NRMXLI)        
  6630.   130          CONTINUE                   
  6631.                CALL WDIV(1.0D0,0.0D0,NRMXLR,NRMXLI,TR,TI)    
  6632.                CALL WSCAL(N-L+1,TR,TI,XR(L,L),XI(L,L),1)     
  6633.                XR(L,L) = FLOP(1.0D0 + XR(L,L))               
  6634. C                      
  6635. C              APPLY THE TRANSFORMATION TO THE REMAINING COLUMNS,               
  6636. C              UPDATING THE NORMS.        
  6637. C                      
  6638.                LP1 = L + 1                
  6639.                IF (P .LT. LP1) GO TO 180  
  6640.                DO 170 J = LP1, P          
  6641.                   TR = -WDOTCR(N-L+1,XR(L,L),XI(L,L),1,XR(L,J),                 
  6642.      *      XI(L,J),1)                    
  6643.                   TI = -WDOTCI(N-L+1,XR(L,L),XI(L,L),1,XR(L,J),                 
  6644.      *      XI(L,J),1)                    
  6645.                   CALL WDIV(TR,TI,XR(L,L),XI(L,L),TR,TI)     
  6646.                   CALL WAXPY(N-L+1,TR,TI,XR(L,L),XI(L,L),1,XR(L,J),             
  6647.      *    XI(L,J),1)   
  6648.                   IF (J .LT. PL .OR. J .GT. PU) GO TO 160    
  6649.                   IF (CABS1(QRAUXR(J),QRAUXI(J)) .EQ. 0.0D0) 
  6650.      *               GO TO 160            
  6651.                     TT = 1.0D0 - (PYTHAG(XR(L,J),XI(L,J))/QRAUXR(J))**2        
  6652.                     TT = DMAX1(TT,0.0D0)                    
  6653.                     TR = FLOP(TT)        
  6654.                     TT = FLOP(1.0D0+0.05D0*TT*(QRAUXR(J)/WORKR(J))**2)         
  6655.                     IF (TT .EQ. 1.0D0) GO TO 140            
  6656.                      QRAUXR(J) = QRAUXR(J)*DSQRT(TR)      
  6657.                      QRAUXI(J) = QRAUXI(J)*DSQRT(TR)      
  6658.                      GO TO 150            
  6659.   140                CONTINUE             
  6660.       QRAUXR(J) = WNRM2(N-L,XR(L+1,J),XI(L+1,J),1)            
  6661.       QRAUXI(J) = 0.0D0                    
  6662.       WORKR(J) = QRAUXR(J)                 
  6663.       WORKI(J) = QRAUXI(J)                 
  6664.   150                CONTINUE             
  6665.   160             CONTINUE                
  6666.   170          CONTINUE                   
  6667.   180          CONTINUE                   
  6668. C                      
  6669. C              SAVE THE TRANSFORMATION.   
  6670. C                      
  6671.                QRAUXR(L) = XR(L,L)        
  6672.                QRAUXI(L) = XI(L,L)        
  6673.                XR(L,L) = -NRMXLR          
  6674.                XI(L,L) = -NRMXLI          
  6675.   190       CONTINUE   
  6676.   200    CONTINUE      
  6677.   210 CONTINUE         
  6678.       RETURN           
  6679.       END              
  6680.       SUBROUTINE WQRSL(XR,XI,LDX,N,K,QRAUXR,QRAUXI,YR,YI,QYR,QYI,QTYR,          
  6681.      *                 QTYI,BR,BI,RSDR,RSDI,XBR,XBI,JOB,INFO)                   
  6682.       INTEGER LDX,N,K,JOB,INFO            
  6683.       DOUBLE PRECISION XR(LDX,1),XI(LDX,1),QRAUXR(1),QRAUXI(1),YR(1),           
  6684.      *                 YI(1),QYR(1),QYI(1),QTYR(1),QTYI(1),BR(1),BI(1),         
  6685.      *                 RSDR(1),RSDI(1),XBR(1),XBI(1)         
  6686. C                      
  6687. C     WQRSL APPLIES THE OUTPUT OF WQRDC TO COMPUTE COORDINATE                   
  6688. C     TRANSFORMATIONS, PROJECTIONS, AND LEAST SQUARES SOLUTIONS.                
  6689. C     FOR K .LE. MIN(N,P), LET XK BE THE MATRIX              
  6690. C                      
  6691. C            XK = (X(JPVT(1)),X(JPVT(2)), ... ,X(JPVT(K)))   
  6692. C                      
  6693. C     FORMED FROM COLUMNNS JPVT(1), ... ,JPVT(K) OF THE ORIGINAL                
  6694. C     N X P MATRIX X THAT WAS INPUT TO WQRDC (IF NO PIVOTING WAS                
  6695. C     DONE, XK CONSISTS OF THE FIRST K COLUMNS OF X IN THEIR 
  6696. C     ORIGINAL ORDER).  WQRDC PRODUCES A FACTORED UNITARY MATRIX Q              
  6697. C     AND AN UPPER TRIANGULAR MATRIX R SUCH THAT             
  6698. C                      
  6699. C              XK = Q * (R)               
  6700. C    (0)               
  6701. C                      
  6702. C     THIS INFORMATION IS CONTAINED IN CODED FORM IN THE ARRAYS                 
  6703. C     X AND QRAUX.     
  6704. C                      
  6705. C     ON ENTRY         
  6706. C                      
  6707. C        X      DOUBLE-COMPLEX(LDX,P).    
  6708. C               X CONTAINS THE OUTPUT OF WQRDC.              
  6709. C                      
  6710. C        LDX    INTEGER.                  
  6711. C               LDX IS THE LEADING DIMENSION OF THE ARRAY X. 
  6712. C                      
  6713. C        N      INTEGER.                  
  6714. C               N IS THE NUMBER OF ROWS OF THE MATRIX XK.  IT MUST              
  6715. C               HAVE THE SAME VALUE AS N IN WQRDC.           
  6716. C                      
  6717. C        K      INTEGER.                  
  6718. C               K IS THE NUMBER OF COLUMNS OF THE MATRIX XK.  K                 
  6719. C               MUST NNOT BE GREATER THAN MIN(N,P), WHERE P IS THE              
  6720. C               SAME AS IN THE CALLING SEQUENCE TO WQRDC.    
  6721. C                      
  6722. C        QRAUX  DOUBLE-COMPLEX(P).        
  6723. C               QRAUX CONTAINS THE AUXILIARY OUTPUT FROM WQRDC.                 
  6724. C                      
  6725. C        Y      DOUBLE-COMPLEX(N)         
  6726. C               Y CONTAINS AN N-VECTOR THAT IS TO BE MANIPULATED                
  6727. C               BY WQRSL.                 
  6728. C                      
  6729. C        JOB    INTEGER.                  
  6730. C               JOB SPECIFIES WHAT IS TO BE COMPUTED.  JOB HAS                  
  6731. C               THE DECIMAL EXPANSION ABCDE, WITH THE FOLLOWING                 
  6732. C               MEANING.                  
  6733. C                      
  6734. C IF A.NE.0, COMPUTE QY.                  
  6735. C IF B,C,D, OR E .NE. 0, COMPUTE QTY.     
  6736. C IF C.NE.0, COMPUTE B.                   
  6737. C IF D.NE.0, COMPUTE RSD.                 
  6738. C IF E.NE.0, COMPUTE XB.                  
  6739. C                      
  6740. C               NOTE THAT A REQUEST TO COMPUTE B, RSD, OR XB 
  6741. C               AUTOMATICALLY TRIGGERS THE COMPUTATION OF QTY, FOR              
  6742. C               WHICH AN ARRAY MUST BE PROVIDED IN THE CALLING                  
  6743. C               SEQUENCE.                 
  6744. C                      
  6745. C     ON RETURN        
  6746. C                      
  6747. C        QY     DOUBLE-COMPLEX(N).        
  6748. C               QY CONNTAINS Q*Y, IF ITS COMPUTATION HAS BEEN                   
  6749. C               REQUESTED.                
  6750. C                      
  6751. C        QTY    DOUBLE-COMPLEX(N).        
  6752. C               QTY CONTAINS CTRANS(Q)*Y, IF ITS COMPUTATION HAS                
  6753. C               BEEN REQUESTED.  HERE CTRANS(Q) IS THE CONJUGATE                
  6754. C               TRANSPOSE OF THE MATRIX Q.                   
  6755. C                      
  6756. C        B      DOUBLE-COMPLEX(K)         
  6757. C               B CONTAINS THE SOLUTION OF THE LEAST SQUARES PROBLEM            
  6758. C                      
  6759. C MINIMIZE NORM2(Y - XK*B),               
  6760. C                      
  6761. C               IF ITS COMPUTATION HAS BEEN REQUESTED.  (NOTE THAT              
  6762. C               IF PIVOTING WAS REQUESTED IN WQRDC, THE J-TH 
  6763. C               COMPONENT OF B WILL BE ASSOCIATED WITH COLUMN JPVT(J)           
  6764. C               OF THE ORIGINAL MATRIX X THAT WAS INPUT INTO WQRDC.)            
  6765. C                      
  6766. C        RSD    DOUBLE-COMPLEX(N).        
  6767. C               RSD CONTAINS THE LEAST SQUARES RESIDUAL Y - XK*B,               
  6768. C               IF ITS COMPUTATION HAS BEEN REQUESTED.  RSD IS                  
  6769. C               ALSO THE ORTHOGONAL PROJECTION OF Y ONTO THE 
  6770. C               ORTHOGONAL COMPLEMENT OF THE COLUMN SPACE OF XK.                
  6771. C                      
  6772. C        XB     DOUBLE-COMPLEX(N).        
  6773. C               XB CONTAINS THE LEAST SQUARES APPROXIMATION XK*B,               
  6774. C               IF ITS COMPUTATION HAS BEEN REQUESTED.  XB IS ALSO              
  6775. C               THE ORTHOGONAL PROJECTION OF Y ONTO THE COLUMN SPACE            
  6776. C               OF X.                     
  6777. C                      
  6778. C        INFO   INTEGER.                  
  6779. C               INFO IS ZERO UNLESS THE COMPUTATION OF B HAS 
  6780. C               BEEN REQUESTED AND R IS EXACTLY SINGULAR.  IN                   
  6781. C               THIS CASE, INFO IS THE INDEX OF THE FIRST ZERO                  
  6782. C               DIAGONAL ELEMENT OF R AND B IS LEFT UNALTERED.                  
  6783. C                      
  6784. C     THE PARAMETERS QY, QTY, B, RSD, AND XB ARE NOT REFERENCED                 
  6785. C     IF THEIR COMPUTATION IS NOT REQUESTED AND IN THIS CASE 
  6786. C     CAN BE REPLACED BY DUMMY VARIABLES IN THE CALLING PROGRAM.                
  6787. C     TO SAVE STORAGE, THE USER MAY IN SOME CASES USE THE SAME                  
  6788. C     ARRAY FOR DIFFERENT PARAMETERS IN THE CALLING SEQUENCE.  A                
  6789. C     FREQUENTLY OCCURING EXAMPLE IS WHEN ONE WISHES TO COMPUTE                 
  6790. C     ANY OF B, RSD, OR XB AND DOES NOT NEED Y OR QTY.  IN THIS                 
  6791. C     CASE ONE MAY IDENTIFY Y, QTY, AND ONE OF B, RSD, OR XB, WHILE             
  6792. C     PROVIDING SEPARATE ARRAYS FOR ANYTHING ELSE THAT IS TO BE                 
  6793. C     COMPUTED.  THUS THE CALLING SEQUENCE                   
  6794. C                      
  6795. C          CALL WQRSL(X,LDX,N,K,QRAUX,Y,DUM,Y,B,Y,DUM,110,INFO)                 
  6796. C                      
  6797. C     WILL RESULT IN THE COMPUTATION OF B AND RSD, WITH RSD  
  6798. C     OVERWRITING Y.  MORE GENERALLY, EACH ITEM IN THE FOLLOWING                
  6799. C     LIST CONTAINS GROUPS OF PERMISSIBLE IDENTIFICATIONS FOR                   
  6800. C     A SINGLE CALLINNG SEQUENCE.         
  6801. C                      
  6802. C          1. (Y,QTY,B) (RSD) (XB) (QY)   
  6803. C                      
  6804. C          2. (Y,QTY,RSD) (B) (XB) (QY)   
  6805. C                      
  6806. C          3. (Y,QTY,XB) (B) (RSD) (QY)   
  6807. C                      
  6808. C          4. (Y,QY) (QTY,B) (RSD) (XB)   
  6809. C                      
  6810. C          5. (Y,QY) (QTY,RSD) (B) (XB)   
  6811. C                      
  6812. C          6. (Y,QY) (QTY,XB) (B) (RSD)   
  6813. C                      
  6814. C     IN ANY GROUP THE VALUE RETURNED IN THE ARRAY ALLOCATED TO                 
  6815. C     THE GROUP CORRESPONDS TO THE LAST MEMBER OF THE GROUP. 
  6816. C                      
  6817. C     LINPACK. THIS VERSION DATED 07/03/79 .                 
  6818. C     G.W. STEWART, UNIVERSITY OF MARYLAND, ARGONNE NATIONAL LAB.               
  6819. C                      
  6820. C     WQRSL USES THE FOLLOWING FUNCTIONS AND SUBPROGRAMS.    
  6821. C                      
  6822. C     BLAS WAXPY,WCOPY,WDOTCR,WDOTCI      
  6823. C     FORTRAN DABS,DIMAG,MIN0,MOD         
  6824. C                      
  6825. C     INTERNAL VARIABLES                  
  6826. C                      
  6827.       INTEGER I,J,JJ,JU,KP1               
  6828.       DOUBLE PRECISION WDOTCR,WDOTCI,TR,TI,TEMPR,TEMPI       
  6829.       LOGICAL CB,CQY,CQTY,CR,CXB          
  6830. C                      
  6831.       DOUBLE PRECISION ZDUMR,ZDUMI        
  6832.       DOUBLE PRECISION CABS1              
  6833.       CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI)         
  6834. C                      
  6835. C     SET INFO FLAG.   
  6836. C                      
  6837.       INFO = 0         
  6838. C                      
  6839. C     DETERMINE WHAT IS TO BE COMPUTED.   
  6840. C                      
  6841.       CQY = JOB/10000 .NE. 0              
  6842.       CQTY = MOD(JOB,10000) .NE. 0        
  6843.       CB = MOD(JOB,1000)/100 .NE. 0       
  6844.       CR = MOD(JOB,100)/10 .NE. 0         
  6845.       CXB = MOD(JOB,10) .NE. 0            
  6846.       JU = MIN0(K,N-1)                    
  6847. C                      
  6848. C     SPECIAL ACTION WHEN N=1.            
  6849. C                      
  6850.       IF (JU .NE. 0) GO TO 80             
  6851.          IF (.NOT.CQY) GO TO 10           
  6852.             QYR(1) = YR(1)                
  6853.             QYI(1) = YI(1)                
  6854.    10    CONTINUE      
  6855.          IF (.NOT.CQTY) GO TO 20          
  6856.             QTYR(1) = YR(1)               
  6857.             QTYI(1) = YI(1)               
  6858.    20    CONTINUE      
  6859.          IF (.NOT.CXB) GO TO 30           
  6860.             XBR(1) = YR(1)                
  6861.             XBI(1) = YI(1)                
  6862.    30    CONTINUE      
  6863.          IF (.NOT.CB) GO TO 60            
  6864.             IF (CABS1(XR(1,1),XI(1,1)) .NE. 0.0D0) GO TO 40  
  6865.                INFO = 1                   
  6866.             GO TO 50   
  6867.    40       CONTINUE   
  6868.                CALL WDIV(YR(1),YI(1),XR(1,1),XI(1,1),BR(1),BI(1))               
  6869.    50       CONTINUE   
  6870.    60    CONTINUE      
  6871.          IF (.NOT.CR) GO TO 70            
  6872.             RSDR(1) = 0.0D0               
  6873.             RSDI(1) = 0.0D0               
  6874.    70    CONTINUE      
  6875.       GO TO 290        
  6876.    80 CONTINUE         
  6877. C                      
  6878. C        SET UP TO COMPUTE QY OR QTY.     
  6879. C                      
  6880.          IF (CQY) CALL WCOPY(N,YR,YI,1,QYR,QYI,1)            
  6881.          IF (CQTY) CALL WCOPY(N,YR,YI,1,QTYR,QTYI,1)         
  6882.          IF (.NOT.CQY) GO TO 110          
  6883. C                      
  6884. C           COMPUTE QY.                   
  6885. C                      
  6886.             DO 100 JJ = 1, JU             
  6887.                J = JU - JJ + 1            
  6888.                IF (CABS1(QRAUXR(J),QRAUXI(J)) .EQ. 0.0D0)    
  6889.      *            GO TO 90                
  6890.                   TEMPR = XR(J,J)         
  6891.                   TEMPI = XI(J,J)         
  6892.                   XR(J,J) = QRAUXR(J)     
  6893.                   XI(J,J) = QRAUXI(J)     
  6894.                   TR = -WDOTCR(N-J+1,XR(J,J),XI(J,J),1,QYR(J),QYI(J),1)         
  6895.                   TI = -WDOTCI(N-J+1,XR(J,J),XI(J,J),1,QYR(J),QYI(J),1)         
  6896.                   CALL WDIV(TR,TI,XR(J,J),XI(J,J),TR,TI)     
  6897.                   CALL WAXPY(N-J+1,TR,TI,XR(J,J),XI(J,J),1,QYR(J),              
  6898.      *    QYI(J),1)    
  6899.                   XR(J,J) = TEMPR         
  6900.                   XI(J,J) = TEMPI         
  6901.    90          CONTINUE                   
  6902.   100       CONTINUE   
  6903.   110    CONTINUE      
  6904.          IF (.NOT.CQTY) GO TO 140         
  6905. C                      
  6906. C           COMPUTE CTRANS(Q)*Y.          
  6907. C                      
  6908.             DO 130 J = 1, JU              
  6909.                IF (CABS1(QRAUXR(J),QRAUXI(J)) .EQ. 0.0D0)    
  6910.      *            GO TO 120               
  6911.                   TEMPR = XR(J,J)         
  6912.                   TEMPI = XI(J,J)         
  6913.                   XR(J,J) = QRAUXR(J)     
  6914.                   XI(J,J) = QRAUXI(J)     
  6915.                   TR = -WDOTCR(N-J+1,XR(J,J),XI(J,J),1,QTYR(J),                 
  6916.      *      QTYI(J),1)                    
  6917.                   TI = -WDOTCI(N-J+1,XR(J,J),XI(J,J),1,QTYR(J),                 
  6918.      *      QTYI(J),1)                    
  6919.                   CALL WDIV(TR,TI,XR(J,J),XI(J,J),TR,TI)     
  6920.                   CALL WAXPY(N-J+1,TR,TI,XR(J,J),XI(J,J),1,QTYR(J),             
  6921.      *    QTYI(J),1)   
  6922.                   XR(J,J) = TEMPR         
  6923.                   XI(J,J) = TEMPI         
  6924.   120          CONTINUE                   
  6925.   130       CONTINUE   
  6926.   140    CONTINUE      
  6927. C                      
  6928. C        SET UP TO COMPUTE B, RSD, OR XB.                    
  6929. C                      
  6930.          IF (CB) CALL WCOPY(K,QTYR,QTYI,1,BR,BI,1)           
  6931.          KP1 = K + 1   
  6932.          IF (CXB) CALL WCOPY(K,QTYR,QTYI,1,XBR,XBI,1)        
  6933.          IF (CR .AND. K .LT. N)           
  6934.      *      CALL WCOPY(N-K,QTYR(KP1),QTYI(KP1),1,RSDR(KP1),RSDI(KP1),1)         
  6935.          IF (.NOT.CXB .OR. KP1 .GT. N) GO TO 160             
  6936.             DO 150 I = KP1, N             
  6937.                XBR(I) = 0.0D0             
  6938.                XBI(I) = 0.0D0             
  6939.   150       CONTINUE   
  6940.   160    CONTINUE      
  6941.          IF (.NOT.CR) GO TO 180           
  6942.             DO 170 I = 1, K               
  6943.                RSDR(I) = 0.0D0            
  6944.                RSDI(I) = 0.0D0            
  6945.   170       CONTINUE   
  6946.   180    CONTINUE      
  6947.          IF (.NOT.CB) GO TO 230           
  6948. C                      
  6949. C           COMPUTE B.                    
  6950. C                      
  6951.             DO 210 JJ = 1, K              
  6952.                J = K - JJ + 1             
  6953.                IF (CABS1(XR(J,J),XI(J,J)) .NE. 0.0D0) GO TO 190                 
  6954.                   INFO = J                
  6955. C                 ......EXIT              
  6956. C           ......EXIT                    
  6957.                   GO TO 220               
  6958.   190          CONTINUE                   
  6959.                CALL WDIV(BR(J),BI(J),XR(J,J),XI(J,J),BR(J),BI(J))               
  6960.                IF (J .EQ. 1) GO TO 200    
  6961.                   TR = -BR(J)             
  6962.                   TI = -BI(J)             
  6963.                   CALL WAXPY(J-1,TR,TI,XR(1,J),XI(1,J),1,BR,BI,1)               
  6964.   200          CONTINUE                   
  6965.   210       CONTINUE   
  6966.   220       CONTINUE   
  6967.   230    CONTINUE      
  6968.          IF (.NOT.CR .AND. .NOT.CXB) GO TO 280               
  6969. C                      
  6970. C           COMPUTE RSD OR XB AS REQUIRED.                   
  6971. C                      
  6972.             DO 270 JJ = 1, JU             
  6973.                J = JU - JJ + 1            
  6974.                IF (CABS1(QRAUXR(J),QRAUXI(J)) .EQ. 0.0D0)    
  6975.      *            GO TO 260               
  6976.                   TEMPR = XR(J,J)         
  6977.                   TEMPI = XI(J,J)         
  6978.                   XR(J,J) = QRAUXR(J)     
  6979.                   XI(J,J) = QRAUXI(J)     
  6980.                   IF (.NOT.CR) GO TO 240  
  6981.                   TR = -WDOTCR(N-J+1,XR(J,J),XI(J,J),1,RSDR(J),              
  6982.      *         RSDI(J),1)                 
  6983.                   TI = -WDOTCI(N-J+1,XR(J,J),XI(J,J),1,RSDR(J),              
  6984.      *         RSDI(J),1)                 
  6985.                   CALL WDIV(TR,TI,XR(J,J),XI(J,J),TR,TI)  
  6986.                   CALL WAXPY(N-J+1,TR,TI,XR(J,J),XI(J,J),1,RSDR(J),          
  6987.      *       RSDI(J),1)                   
  6988.   240             CONTINUE                
  6989.                   IF (.NOT.CXB) GO TO 250                    
  6990.                    TR = -WDOTCR(N-J+1,XR(J,J),XI(J,J),1,XBR(J),               
  6991.      *         XBI(J),1)                  
  6992.                    TI = -WDOTCI(N-J+1,XR(J,J),XI(J,J),1,XBR(J),               
  6993.      *         XBI(J),1)                  
  6994.                    CALL WDIV(TR,TI,XR(J,J),XI(J,J),TR,TI)  
  6995.                    CALL WAXPY(N-J+1,TR,TI,XR(J,J),XI(J,J),1,XBR(J),           
  6996.      *       XBI(J),1)                    
  6997.   250             CONTINUE                
  6998.                   XR(J,J) = TEMPR         
  6999.                   XI(J,J) = TEMPI         
  7000.   260          CONTINUE                   
  7001.   270       CONTINUE   
  7002.   280    CONTINUE      
  7003.   290 CONTINUE         
  7004.       RETURN           
  7005.       END              
  7006.       SUBROUTINE MAGIC(A,LDA,N)           
  7007. C                      
  7008. C     ALGORITHMS FOR MAGIC SQUARES TAKEN FROM                
  7009. C        MATHEMATICAL RECREATIONS AND ESSAYS, 12TH ED.,      
  7010. C        BY W. W. ROUSE BALL AND H. S. M. COXETER            
  7011. C                      
  7012.       DOUBLE PRECISION A(LDA,N),T         
  7013. C                      
  7014.       IF (MOD(N,4) .EQ. 0) GO TO 100      
  7015.       IF (MOD(N,2) .EQ. 0) M = N/2        
  7016.       IF (MOD(N,2) .NE. 0) M = N          
  7017. C                      
  7018. C     ODD ORDER OR UPPER CORNER OF EVEN ORDER                
  7019. C                      
  7020.       DO 20 J = 1,M    
  7021.          DO 10 I = 1,M                    
  7022.             A(I,J) = 0                    
  7023.    10    CONTINUE      
  7024.    20 CONTINUE         
  7025.       I = 1            
  7026.       J = (M+1)/2      
  7027.       MM = M*M         
  7028.       DO 40 K = 1, MM                     
  7029.          A(I,J) = K    
  7030.          I1 = I-1      
  7031.          J1 = J+1      
  7032.          IF(I1.LT.1) I1 = M               
  7033.          IF(J1.GT.M) J1 = 1               
  7034.          IF(IDINT(A(I1,J1)).EQ.0) GO TO 30                   
  7035.             I1 = I+1   
  7036.             J1 = J     
  7037.    30    I = I1        
  7038.          J = J1        
  7039.    40 CONTINUE         
  7040.       IF (MOD(N,2) .NE. 0) RETURN         
  7041. C                      
  7042. C     REST OF EVEN ORDER                  
  7043. C                      
  7044.       T = M*M          
  7045.       DO 60 I = 1, M   
  7046.          DO 50 J = 1, M                   
  7047.             IM = I+M   
  7048.             JM = J+M   
  7049.             A(I,JM) = A(I,J) + 2*T        
  7050.             A(IM,J) = A(I,J) + 3*T        
  7051.             A(IM,JM) = A(I,J) + T         
  7052.    50    CONTINUE      
  7053.    60 CONTINUE         
  7054.       M1 = (M-1)/2     
  7055.       IF (M1.EQ.0) RETURN                 
  7056.       DO 70 J = 1, M1                     
  7057.          CALL RSWAP(M,A(1,J),1,A(M+1,J),1)                   
  7058.    70 CONTINUE         
  7059.       M1 = (M+1)/2     
  7060.       M2 = M1 + M      
  7061.       CALL RSWAP(1,A(M1,1),1,A(M2,1),1)   
  7062.       CALL RSWAP(1,A(M1,M1),1,A(M2,M1),1)                    
  7063.       M1 = N+1-(M-3)/2                    
  7064.       IF(M1.GT.N) RETURN                  
  7065.       DO 80 J = M1, N                     
  7066.          CALL RSWAP(M,A(1,J),1,A(M+1,J),1)                   
  7067.    80 CONTINUE         
  7068.       RETURN           
  7069. C                      
  7070. C     DOUBLE EVEN ORDER                   
  7071. C                      
  7072.   100 K = 1            
  7073.       DO 120 I = 1, N                     
  7074.          DO 110 J = 1, N                  
  7075.             A(I,J) = K                    
  7076.             IF (MOD(I,4)/2 .EQ. MOD(J,4)/2) A(I,J) = N*N+1 - K                  
  7077.             K = K+1    
  7078.   110    CONTINUE      
  7079.   120 CONTINUE         
  7080.       RETURN           
  7081.       END              
  7082.       SUBROUTINE BASE(X,B,EPS,S,N)        
  7083.       DOUBLE PRECISION X,B,EPS,S(1),T     
  7084. C                      
  7085. C     STORE BASE B REPRESENTATION OF X IN S(1:N)             
  7086. C                      
  7087.       INTEGER PLUS,MINUS,DOT,ZERO,COMMA   
  7088.       DATA PLUS/41/,MINUS/42/,DOT/47/,ZERO/0/,COMMA/48/      
  7089.       L = 1            
  7090.       IF (X .GE. 0.0D0) S(L) = PLUS       
  7091.       IF (X .LT. 0.0D0) S(L) = MINUS      
  7092.       S(L+1) = ZERO    
  7093.       S(L+2) = DOT     
  7094.       X = DABS(X)      
  7095.       IF (X .NE. 0.0D0) K = DLOG(X)/DLOG(B)                  
  7096.       IF (X .EQ. 0.0D0) K = 0             
  7097.       IF (X .GT. 1.0D0) K = K + 1         
  7098.       X = X/B**K       
  7099.       IF (B*X .GE. B) K = K + 1           
  7100.       IF (B*X .GE. B) X = X/B             
  7101.       IF (EPS .NE. 0.0D0) M = -DLOG(EPS)/DLOG(B) + 4         
  7102.       IF (EPS .EQ. 0.0D0) M = 54          
  7103.       DO 10 L = 4, M   
  7104.       X = B*X          
  7105.       J = IDINT(X)     
  7106.       S(L) = DFLOAT(J)                    
  7107.       X = X - S(L)     
  7108.    10 CONTINUE         
  7109.       S(M+1) = COMMA   
  7110.       IF (K .GE. 0) S(M+2) = PLUS         
  7111.       IF (K .LT. 0) S(M+2) = MINUS        
  7112.       T = DABS(DFLOAT(K))                 
  7113.       N = M + 3        
  7114.       IF (T .GE. B) N = N + IDINT(DLOG(T)/DLOG(B))           
  7115.       L = N            
  7116.    20 J = IDINT(DMOD(T,B))                
  7117.       S(L) = DFLOAT(J)                    
  7118.       L = L - 1        
  7119.       T = T/B          
  7120.       IF (L .GE. M+3) GO TO 20            
  7121.       RETURN           
  7122.       END              
  7123.       DOUBLE PRECISION FUNCTION URAND(IY)                    
  7124.       INTEGER IY       
  7125. C                      
  7126. C      URAND IS A UNIFORM RANDOM NUMBER GENERATOR BASED  ON  THEORY  AND        
  7127. C  SUGGESTIONS  GIVEN  IN  D.E. KNUTH (1969),  VOL  2.   THE INTEGER  IY        
  7128. C  SHOULD BE INITIALIZED TO AN ARBITRARY INTEGER PRIOR TO THE FIRST CALL        
  7129. C  TO URAND.  THE CALLING PROGRAM SHOULD  NOT  ALTER  THE  VALUE  OF  IY        
  7130. C  BETWEEN  SUBSEQUENT CALLS TO URAND.  VALUES OF URAND WILL BE RETURNED        
  7131. C  IN THE INTERVAL (0,1).                 
  7132. C                      
  7133.       INTEGER IA,IC,ITWO,M2,M,MIC         
  7134.       DOUBLE PRECISION HALFM,S            
  7135.       DOUBLE PRECISION DATAN,DSQRT        
  7136.       DATA M2/0/,ITWO/2/                  
  7137.       IF (M2 .NE. 0) GO TO 20             
  7138. C                      
  7139. C  IF FIRST ENTRY, COMPUTE MACHINE INTEGER WORD LENGTH       
  7140. C                      
  7141.       M = 1            
  7142.    10 M2 = M           
  7143.       M = ITWO*M2      
  7144.       IF (M .GT. M2) GO TO 10             
  7145.       HALFM = M2       
  7146. C                      
  7147. C  COMPUTE MULTIPLIER AND INCREMENT FOR LINEAR CONGRUENTIAL METHOD              
  7148. C                      
  7149.       IA = 8*IDINT(HALFM*DATAN(1.D0)/8.D0) + 5               
  7150.       IC = 2*IDINT(HALFM*(0.5D0-DSQRT(3.D0)/6.D0)) + 1       
  7151.       MIC = (M2 - IC) + M2                
  7152. C                      
  7153. C  S IS THE SCALE FACTOR FOR CONVERTING TO FLOATING POINT    
  7154. C                      
  7155.       S = 0.5D0/HALFM                     
  7156. C                      
  7157. C  COMPUTE NEXT RANDOM NUMBER             
  7158. C                      
  7159.    20 IY = IY*IA       
  7160. C                      
  7161. C  THE FOLLOWING STATEMENT IS FOR COMPUTERS WHICH DO NOT ALLOW                  
  7162. C  INTEGER OVERFLOW ON ADDITION           
  7163. C                      
  7164.       IF (IY .GT. MIC) IY = (IY - M2) - M2                   
  7165. C                      
  7166.       IY = IY + IC     
  7167. C                      
  7168. C  THE FOLLOWING STATEMENT IS FOR COMPUTERS WHERE THE        
  7169. C  WORD LENGTH FOR ADDITION IS GREATER THAN FOR MULTIPLICATION                  
  7170. C                      
  7171.       IF (IY/2 .GT. M2) IY = (IY - M2) - M2                  
  7172. C                      
  7173. C  THE FOLLOWING STATEMENT IS FOR COMPUTERS WHERE INTEGER    
  7174. C  OVERFLOW AFFECTS THE SIGN BIT          
  7175. C                      
  7176.       IF (IY .LT. 0) IY = (IY + M2) + M2  
  7177.       URAND = DFLOAT(IY)*S                
  7178.       RETURN           
  7179.       END              
  7180.       SUBROUTINE WMUL(AR,AI,BR,BI,CR,CI)  
  7181.       DOUBLE PRECISION AR,AI,BR,BI,CR,CI,T,FLOP              
  7182. C     C = A*B          
  7183.       T = AR*BI + AI*BR                   
  7184.       IF (T .NE. 0.0D0) T = FLOP(T)       
  7185.       CR = FLOP(AR*BR - AI*BI)            
  7186.       CI = T           
  7187.       RETURN           
  7188.       END              
  7189.       SUBROUTINE WDIV(AR,AI,BR,BI,CR,CI)  
  7190.       DOUBLE PRECISION AR,AI,BR,BI,CR,CI  
  7191. C     C = A/B          
  7192.       DOUBLE PRECISION S,D,ARS,AIS,BRS,BIS,FLOP              
  7193.       S = DABS(BR) + DABS(BI)             
  7194.       IF (S .EQ. 0.0D0) CALL ERROR(27)    
  7195.       IF (S .EQ. 0.0D0) RETURN            
  7196.       ARS = AR/S       
  7197.       AIS = AI/S       
  7198.       BRS = BR/S       
  7199.       BIS = BI/S       
  7200.       D = BRS**2 + BIS**2                 
  7201.       CR = FLOP((ARS*BRS + AIS*BIS)/D)    
  7202.       CI = (AIS*BRS - ARS*BIS)/D          
  7203.       IF (CI .NE. 0.0D0) CI = FLOP(CI)    
  7204.       RETURN           
  7205.       END              
  7206.       SUBROUTINE WSIGN(XR,XI,YR,YI,ZR,ZI)                    
  7207.       DOUBLE PRECISION XR,XI,YR,YI,ZR,ZI,PYTHAG,T            
  7208. C     IF Y .NE. 0, Z = X*Y/ABS(Y)         
  7209. C     IF Y .EQ. 0, Z = X                  
  7210.       T = PYTHAG(YR,YI)                   
  7211.       ZR = XR          
  7212.       ZI = XI          
  7213.       IF (T .NE. 0.0D0) CALL WMUL(YR/T,YI/T,ZR,ZI,ZR,ZI)     
  7214.       RETURN           
  7215.       END              
  7216.       SUBROUTINE WSQRT(XR,XI,YR,YI)       
  7217.       DOUBLE PRECISION XR,XI,YR,YI,S,TR,TI,PYTHAG,FLOP       
  7218. C     Y = SQRT(X) WITH YR .GE. 0.0 AND SIGN(YI) .EQ. SIGN(XI)                   
  7219. C                      
  7220.       TR = XR          
  7221.       TI = XI          
  7222.       S = DSQRT(0.5D0*(PYTHAG(TR,TI) + DABS(TR)))            
  7223.       IF (TR .GE. 0.0D0) YR = FLOP(S)     
  7224.       IF (TI .LT. 0.0D0) S = -S           
  7225.       IF (TR .LE. 0.0D0) YI = FLOP(S)     
  7226.       IF (TR .LT. 0.0D0) YR = FLOP(0.5D0*(TI/YI))            
  7227.       IF (TR .GT. 0.0D0) YI = FLOP(0.5D0*(TI/YR))            
  7228.       RETURN           
  7229.       END              
  7230.       SUBROUTINE WLOG(XR,XI,YR,YI)        
  7231.       DOUBLE PRECISION XR,XI,YR,YI,T,R,PYTHAG                
  7232. C     Y = LOG(X)       
  7233.       R = PYTHAG(XR,XI)                   
  7234.       IF (R .EQ. 0.0D0) CALL ERROR(32)    
  7235.       IF (R .EQ. 0.0D0) RETURN            
  7236.       T = DATAN2(XI,XR)                   
  7237.       IF (XI.EQ.0.0D0 .AND. XR.LT.0.0D0) T = DABS(T)         
  7238.       YR = DLOG(R)     
  7239.       YI = T           
  7240.       RETURN           
  7241.       END              
  7242.       SUBROUTINE WATAN(XR,XI,YR,YI)       
  7243. C     Y = ATAN(X) = (I/2)*LOG((I+X)/(I-X))                   
  7244.       DOUBLE PRECISION XR,XI,YR,YI,TR,TI  
  7245.       IF (XI .NE. 0.0D0) GO TO 10         
  7246.          YR = DATAN2(XR,1.0D0)            
  7247.          YI = 0.0D0    
  7248.          RETURN        
  7249.    10 IF (XR.NE.0.0D0 .OR. DABS(XI).NE.1.0D0) GO TO 20       
  7250.          CALL ERROR(32)                   
  7251.          RETURN        
  7252.    20 CALL WDIV(XR,1.0D0+XI,-XR,1.0D0-XI,TR,TI)              
  7253.       CALL WLOG(TR,TI,TR,TI)              
  7254.       YR = -TI/2.0D0   
  7255.       YI = TR/2.0D0    
  7256.       RETURN           
  7257.       END              
  7258.       DOUBLE PRECISION FUNCTION WNRM2(N,XR,XI,INCX)          
  7259.       DOUBLE PRECISION XR(1),XI(1),PYTHAG,S                  
  7260. C     NORM2(X)         
  7261.       S = 0.0D0        
  7262.       IF (N .LE. 0) GO TO 20              
  7263.       IX = 1           
  7264.       DO 10 I = 1, N   
  7265.          S = PYTHAG(S,XR(IX))             
  7266.          S = PYTHAG(S,XI(IX))             
  7267.          IX = IX + INCX                   
  7268.    10 CONTINUE         
  7269.    20 WNRM2 = S        
  7270.       RETURN           
  7271.       END              
  7272.       DOUBLE PRECISION FUNCTION WASUM(N,XR,XI,INCX)          
  7273.       DOUBLE PRECISION XR(1),XI(1),S,FLOP                    
  7274. C     NORM1(X)         
  7275.       S = 0.0D0        
  7276.       IF (N .LE. 0) GO TO 20              
  7277.       IX = 1           
  7278.       DO 10 I = 1, N   
  7279.          S = FLOP(S + DABS(XR(IX)) + DABS(XI(IX)))           
  7280.          IX = IX + INCX                   
  7281.    10 CONTINUE         
  7282.    20 WASUM = S        
  7283.       RETURN           
  7284.       END              
  7285.       INTEGER FUNCTION IWAMAX(N,XR,XI,INCX)                  
  7286.       DOUBLE PRECISION XR(1),XI(1),S,P    
  7287. C     INDEX OF NORMINF(X)                 
  7288.       K = 0            
  7289.       IF (N .LE. 0) GO TO 20              
  7290.       K = 1            
  7291.       S = 0.0D0        
  7292.       IX = 1           
  7293.       DO 10 I = 1, N   
  7294.          P = DABS(XR(IX)) + DABS(XI(IX))  
  7295.          IF (P .GT. S) K = I              
  7296.          IF (P .GT. S) S = P              
  7297.          IX = IX + INCX                   
  7298.    10 CONTINUE         
  7299.    20 IWAMAX = K       
  7300.       RETURN           
  7301.       END              
  7302.       SUBROUTINE WRSCAL(N,S,XR,XI,INCX)   
  7303.       DOUBLE PRECISION S,XR(1),XI(1),FLOP                    
  7304.       IF (N .LE. 0) RETURN                
  7305.       IX = 1           
  7306.       DO 10 I = 1, N   
  7307.          XR(IX) = FLOP(S*XR(IX))          
  7308.          IF (XI(IX) .NE. 0.0D0) XI(IX) = FLOP(S*XI(IX))      
  7309.          IX = IX + INCX                   
  7310.    10 CONTINUE         
  7311.       RETURN           
  7312.       END              
  7313.       SUBROUTINE WSCAL(N,SR,SI,XR,XI,INCX)                   
  7314.       DOUBLE PRECISION SR,SI,XR(1),XI(1)  
  7315.       IF (N .LE. 0) RETURN                
  7316.       IX = 1           
  7317.       DO 10 I = 1, N   
  7318.          CALL WMUL(SR,SI,XR(IX),XI(IX),XR(IX),XI(IX))        
  7319.          IX = IX + INCX                   
  7320.    10 CONTINUE         
  7321.       RETURN           
  7322.       END              
  7323.       SUBROUTINE WAXPY(N,SR,SI,XR,XI,INCX,YR,YI,INCY)        
  7324.       DOUBLE PRECISION SR,SI,XR(1),XI(1),YR(1),YI(1),FLOP    
  7325.       IF (N .LE. 0) RETURN                
  7326.       IF (SR .EQ. 0.0D0 .AND. SI .EQ. 0.0D0) RETURN          
  7327.       IX = 1           
  7328.       IY = 1           
  7329.       IF (INCX.LT.0) IX = (-N+1)*INCX + 1                    
  7330.       IF (INCY.LT.0) IY = (-N+1)*INCY + 1                    
  7331.       DO 10 I = 1, N   
  7332.          YR(IY) = FLOP(YR(IY) + SR*XR(IX) - SI*XI(IX))       
  7333.          YI(IY) = YI(IY) + SR*XI(IX) + SI*XR(IX)             
  7334.          IF (YI(IY) .NE. 0.0D0) YI(IY) = FLOP(YI(IY))        
  7335.          IX = IX + INCX                   
  7336.          IY = IY + INCY                   
  7337.    10 CONTINUE         
  7338.       RETURN           
  7339.       END              
  7340.       DOUBLE PRECISION FUNCTION WDOTUR(N,XR,XI,INCX,YR,YI,INCY)                 
  7341.       DOUBLE PRECISION XR(1),XI(1),YR(1),YI(1),S,FLOP        
  7342.       S = 0.0D0        
  7343.       IF (N .LE. 0) GO TO 20              
  7344.       IX = 1           
  7345.       IY = 1           
  7346.       IF (INCX.LT.0) IX = (-N+1)*INCX + 1                    
  7347.       IF (INCY.LT.0) IY = (-N+1)*INCY + 1                    
  7348.       DO 10 I = 1, N   
  7349.          S = FLOP(S + XR(IX)*YR(IY) - XI(IX)*YI(IY))         
  7350.          IX = IX + INCX                   
  7351.          IY = IY + INCY                   
  7352.    10 CONTINUE         
  7353.    20 WDOTUR = S       
  7354.       RETURN           
  7355.       END              
  7356.       DOUBLE PRECISION FUNCTION WDOTUI(N,XR,XI,INCX,YR,YI,INCY)                 
  7357.       DOUBLE PRECISION XR(1),XI(1),YR(1),YI(1),S,FLOP        
  7358.       S = 0.0D0        
  7359.       IF (N .LE. 0) GO TO 20              
  7360.       IX = 1           
  7361.       IY = 1           
  7362.       IF (INCX.LT.0) IX = (-N+1)*INCX + 1                    
  7363.       IF (INCY.LT.0) IY = (-N+1)*INCY + 1                    
  7364.       DO 10 I = 1, N   
  7365.          S = S + XR(IX)*YI(IY) + XI(IX)*YR(IY)               
  7366.          IF (S .NE. 0.0D0) S = FLOP(S)    
  7367.          IX = IX + INCX                   
  7368.          IY = IY + INCY                   
  7369.    10 CONTINUE         
  7370.    20 WDOTUI = S       
  7371.       RETURN           
  7372.       END              
  7373.       DOUBLE PRECISION FUNCTION WDOTCR(N,XR,XI,INCX,YR,YI,INCY)                 
  7374.       DOUBLE PRECISION XR(1),XI(1),YR(1),YI(1),S,FLOP        
  7375.       S = 0.0D0        
  7376.       IF (N .LE. 0) GO TO 20              
  7377.       IX = 1           
  7378.       IY = 1           
  7379.       IF (INCX.LT.0) IX = (-N+1)*INCX + 1                    
  7380.       IF (INCY.LT.0) IY = (-N+1)*INCY + 1                    
  7381.       DO 10 I = 1, N   
  7382.          S = FLOP(S + XR(IX)*YR(IY) + XI(IX)*YI(IY))         
  7383.          IX = IX + INCX                   
  7384.          IY = IY + INCY                   
  7385.    10 CONTINUE         
  7386.    20 WDOTCR = S       
  7387.       RETURN           
  7388.       END              
  7389.       DOUBLE PRECISION FUNCTION WDOTCI(N,XR,XI,INCX,YR,YI,INCY)                 
  7390.       DOUBLE PRECISION XR(1),XI(1),YR(1),YI(1),S,FLOP        
  7391.       S = 0.0D0        
  7392.       IF (N .LE. 0) GO TO 20              
  7393.       IX = 1           
  7394.       IY = 1           
  7395.       IF (INCX.LT.0) IX = (-N+1)*INCX + 1                    
  7396.       IF (INCY.LT.0) IY = (-N+1)*INCY + 1                    
  7397.       DO 10 I = 1, N   
  7398.          S = S + XR(IX)*YI(IY) - XI(IX)*YR(IY)               
  7399.          IF (S .NE. 0.0D0) S = FLOP(S)    
  7400.          IX = IX + INCX                   
  7401.          IY = IY + INCY                   
  7402.    10 CONTINUE         
  7403.    20 WDOTCI = S       
  7404.       RETURN           
  7405.       END              
  7406.       SUBROUTINE WCOPY(N,XR,XI,INCX,YR,YI,INCY)              
  7407.       DOUBLE PRECISION XR(1),XI(1),YR(1),YI(1)               
  7408.       IF (N .LE. 0) RETURN                
  7409.       IX = 1           
  7410.       IY = 1           
  7411.       IF (INCX.LT.0) IX = (-N+1)*INCX + 1                    
  7412.       IF (INCY.LT.0) IY = (-N+1)*INCY + 1                    
  7413.       DO 10 I = 1, N   
  7414.          YR(IY) = XR(IX)                  
  7415.          YI(IY) = XI(IX)                  
  7416.          IX = IX + INCX                   
  7417.          IY = IY + INCY                   
  7418.    10 CONTINUE         
  7419.       RETURN           
  7420.       END              
  7421.       SUBROUTINE WSET(N,XR,XI,YR,YI,INCY)                    
  7422.       INTEGER N,INCY   
  7423.       DOUBLE PRECISION XR,XI,YR(1),YI(1)  
  7424.       IY = 1           
  7425.       IF (N .LE. 0 ) RETURN               
  7426.       DO 10 I = 1,N    
  7427.          YR(IY) = XR   
  7428.          YI(IY) = XI   
  7429.          IY = IY + INCY                   
  7430.    10 CONTINUE         
  7431.       RETURN           
  7432.       END              
  7433.       SUBROUTINE WSWAP(N,XR,XI,INCX,YR,YI,INCY)              
  7434.       DOUBLE PRECISION XR(1),XI(1),YR(1),YI(1),T             
  7435.       IF (N .LE. 0) RETURN                
  7436.       IX = 1           
  7437.       IY = 1           
  7438.       IF (INCX.LT.0) IX = (-N+1)*INCX + 1                    
  7439.       IF (INCY.LT.0) IY = (-N+1)*INCY + 1                    
  7440.       DO 10 I = 1, N   
  7441.          T = XR(IX)    
  7442.          XR(IX) = YR(IY)                  
  7443.          YR(IY) = T    
  7444.          T = XI(IX)    
  7445.          XI(IX) = YI(IY)                  
  7446.          YI(IY) = T    
  7447.          IX = IX + INCX                   
  7448.          IY = IY + INCY                   
  7449.    10 CONTINUE         
  7450.       RETURN           
  7451.       END              
  7452.       SUBROUTINE RSET(N,DX,DY,INCY)       
  7453. C                      
  7454. C     COPIES A SCALAR, X, TO A SCALAR, Y.                    
  7455.       DOUBLE PRECISION DX,DY(1)           
  7456. C                      
  7457.       IF (N.LE.0) RETURN                  
  7458.       IY = 1           
  7459.       IF (INCY.LT.0) IY = (-N+1)*INCY + 1                    
  7460.       DO 10 I = 1,N    
  7461.         DY(IY) = DX    
  7462.         IY = IY + INCY                    
  7463.    10 CONTINUE         
  7464.       RETURN           
  7465.       END              
  7466.       SUBROUTINE RSWAP(N,X,INCX,Y,INCY)   
  7467.       DOUBLE PRECISION X(1),Y(1),T        
  7468.       IF (N .LE. 0) RETURN                
  7469.       IX = 1           
  7470.       IY = 1           
  7471.       IF (INCX.LT.0) IX = (-N+1)*INCX+1   
  7472.       IF (INCY.LT.0) IY = (-N+1)*INCY+1   
  7473.       DO 10 I = 1, N   
  7474.          T = X(IX)     
  7475.          X(IX) = Y(IY)                    
  7476.          Y(IY) = T     
  7477.          IX = IX + INCX                   
  7478.          IY = IY + INCY                   
  7479.    10 CONTINUE         
  7480.       RETURN           
  7481.       END              
  7482.       SUBROUTINE RROT(N,DX,INCX,DY,INCY,C,S)                 
  7483. C                      
  7484. C     APPLIES A PLANE ROTATION.           
  7485.       DOUBLE PRECISION DX(1),DY(1),DTEMP,C,S,FLOP            
  7486.       INTEGER I,INCX,INCY,IX,IY,N         
  7487. C                      
  7488.       IF (N.LE.0) RETURN                  
  7489.       IX = 1           
  7490.       IY = 1           
  7491.       IF (INCX.LT.0) IX = (-N+1)*INCX + 1                    
  7492.       IF (INCY.LT.0) IY = (-N+1)*INCY + 1                    
  7493.       DO 10 I = 1,N    
  7494.         DTEMP = FLOP(C*DX(IX) + S*DY(IY))                    
  7495.         DY(IY) = FLOP(C*DY(IY) - S*DX(IX))                   
  7496.         DX(IX) = DTEMP                    
  7497.         IX = IX + INCX                    
  7498.         IY = IY + INCY                    
  7499.    10 CONTINUE         
  7500.       RETURN           
  7501.       END              
  7502.       SUBROUTINE RROTG(DA,DB,C,S)         
  7503. C                      
  7504. C     CONSTRUCT GIVENS PLANE ROTATION.    
  7505. C                      
  7506.       DOUBLE PRECISION DA,DB,C,S,RHO,PYTHAG,FLOP,R,Z         
  7507. C                      
  7508.       RHO = DB         
  7509.       IF ( DABS(DA) .GT. DABS(DB) ) RHO = DA                 
  7510.       C = 1.0D0        
  7511.       S = 0.0D0        
  7512.       Z = 1.0D0        
  7513.       R = FLOP(DSIGN(PYTHAG(DA,DB),RHO))  
  7514.       IF (R .NE. 0.0D0) C = FLOP(DA/R)    
  7515.       IF (R .NE. 0.0D0) S = FLOP(DB/R)    
  7516.       IF ( DABS(DA) .GT. DABS(DB) ) Z = S                    
  7517.       IF ( DABS(DB) .GE. DABS(DA) .AND. C .NE. 0.0D0 ) Z = FLOP(1.0D0/C)        
  7518.       DA = R           
  7519.       DB = Z           
  7520.       RETURN           
  7521.       END              
  7522.       LOGICAL FUNCTION EQID(X,Y)          
  7523. C     CHECK FOR EQUALITY OF TWO NAMES     
  7524.       INTEGER X(4),Y(4)                   
  7525.       EQID = .TRUE.    
  7526.       DO 10 I = 1, 4   
  7527.    10 EQID = EQID .AND. (X(I).EQ.Y(I))    
  7528.       RETURN           
  7529.       END              
  7530.       SUBROUTINE PUTID(X,Y)               
  7531. C     STORE A NAME     
  7532.       INTEGER X(4),Y(4)                   
  7533.       DO 10 I = 1, 4   
  7534.    10 X(I) = Y(I)      
  7535.       RETURN           
  7536.       END              
  7537.       DOUBLE PRECISION FUNCTION ROUND(X)  
  7538.       DOUBLE PRECISION X,Y,Z,E,H          
  7539.       DATA H/1.0D9/    
  7540.       Z = DABS(X)      
  7541.       Y = Z + 1.0D0    
  7542.       IF (Y .EQ. Z) GO TO 40              
  7543.       Y = 0.0D0        
  7544.       E = H            
  7545.    10 IF (E .GE. Z) GO TO 20              
  7546.          E = 2.0D0*E   
  7547.          GO TO 10      
  7548.    20 IF (E .LE. H) GO TO 30              
  7549.          IF (E .LE. Z) Y = Y + E          
  7550.          IF (E .LE. Z) Z = Z - E          
  7551.          E = E/2.0D0   
  7552.          GO TO 20      
  7553.    30 Z = IDINT(Z + 0.5D0)                
  7554.       Y = Y + Z        
  7555.       IF (X .LT. 0.0D0) Y = -Y            
  7556.       ROUND = Y        
  7557.       RETURN           
  7558.    40 ROUND = X        
  7559.       RETURN           
  7560.       END              
  7561.       FUNCTION DFLOAT(I)
  7562. C
  7563. C   THIS IS THE AMIGA FUNCTION WHICH CONVERTS INTEGERS TO DOUBLE FLOATS
  7564. C
  7565.       IMPLICIT NONE
  7566.       DFLOAT = DBLE(I)
  7567.       RETURN
  7568.       END
  7569.