home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d2xx / d267 / matlab.lha / Matlab / matlab.zoo / matlab / src / matlab.for next >
Encoding:
Text File  |  1989-06-20  |  220.2 KB  |  7,603 lines

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