home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / eispack-1.0-src.tgz / tar.out / contrib / eispack / tests / rsgbatest.f < prev    next >
Text File  |  1996-09-28  |  16KB  |  463 lines

  1. C
  2. C     THIS DRIVER TESTS  EISPACK  FOR THE REAL SYMMETRIC GENERALIZED
  3. C     EIGENPROBLEM  B*A*X = (LAMBDA)*X  WITH  B  POSITIVE DEFINITE,
  4. C     SUMMARIZING THE FIGURES OF MERIT FOR ALL PATHS.
  5. C
  6. C     THIS DRIVER IS CATALOGUED AS  EISPDRV4(RSGBASUM).
  7. C
  8. C     THE DIMENSION OF  A,B, AND  Z  SHOULD BE  NM  BY  NM.
  9. C     THE DIMENSION OF  W,D,E,E2,IND,RV1,RV2,RV3,RV4,RV5,RV6,DL,
  10. C     W1, AND  W2  SHOULD BE  NM.
  11. C     THE DIMENSION OF  AHOLD  AND  BHOLD  SHOULD BE  NM  BY  NM.
  12. C     HERE NM = 20.
  13. C
  14.       DOUBLE PRECISION A( 20, 20),Z( 20, 20),W( 20),D( 20),E( 20),
  15.      X        E2( 20),RV1( 20),RV2( 20),RV3( 20),RV4( 20),RV5( 20),
  16.      X        RV6( 20),W1( 20),W2( 20),TCRIT( 8),EPSLON,RESDUL,MAXEIG,
  17.      X        MAXDIF,U,LB,UB,EPS1,B( 20, 20),DL( 20),DFL
  18.       DOUBLE PRECISION AHOLD( 20, 20),BHOLD( 20, 20) 
  19.       REAL XLB,XUB
  20.       INTEGER  IND( 20),IERR( 6),ERROR
  21.       DATA IREAD1/1/,IREAD2/2/,IREADC/5/,IWRITE/6/
  22. C
  23.       OPEN(UNIT=IREAD1,FILE='FILE35')
  24.       OPEN(UNIT=IREAD2,FILE='FILE47')
  25.       OPEN(UNIT=IREADC,FILE='FILE36')
  26.       REWIND IREAD1
  27.       REWIND IREAD2
  28.       REWIND IREADC
  29. C
  30.       NM = 20
  31.       LCOUNT = 0
  32.       WRITE(IWRITE,1)
  33.     1 FORMAT(1H1,19X,57H EXPLANATION OF COLUMN ENTRIES FOR THE SUMMARY S
  34.      XTATISTICS//1H ,95(1H-)/96H ORDER TQL2   TQLRAT IMTQL2 IMTQL1    LB
  35.      X      UB    M  IMTQLV   TSTURM   BISECT  M1 NO  TRIDIB  /1H ,95(
  36.      X1H-)//55H UNDER 'ORDER' IS THE ORDER OF EACH TEST MATRIX SYSTEM.//
  37.      X95H UNDER 'TQL2   TQLRAT' ARE THREE NUMBERS.  THE FIRST NUMBER, AN
  38.      X INTEGER, IS THE ABSOLUTE SUM OF/
  39.      X61H THE ERROR FLAGS RETURNED SEPARATELY FROM  TQL2  AND  TQLRAT.,
  40.      X34H  THE SECOND NUMBER IS THE MEASURE/
  41.      X62H OF PERFORMANCE BASED UPON THE RESIDUAL COMPUTED FOR THE  TQL2,
  42.      X25H  PATH.  THE THIRD NUMBER        /
  43.      X62H MEASURES THE AGREEMENT OF THE EIGENVALUES FROM THE  TQL2  AND,
  44.      X16H  TQLRAT  PATHS.  //
  45.      X95H UNDER 'IMTQL2 IMTQL1' ARE THREE NUMBERS WITH MEANING LIKE THOS
  46.      XE UNDER  'TQL2   TQLRAT'.       //
  47.      X95H UNDER 'LB' AND 'UB' ARE THE INPUT VARIABLES SPECIFYING THE INT
  48.      XERVAL TO  BISECT  AND  TSTURM.  //
  49.      X61H UNDER 'M' IS THE NUMBER OF EIGENVALUES DETERMINED BY  BISECT,
  50.      X30H  AND  TSTURM  THAT LIE IN THE    /18H INTERVAL (LB,UB).//
  51.      X95H UNDER EACH OF 'IMTQLV', 'TSTURM', 'BISECT', AND 'TRIDIB' ARE T
  52.      XWO NUMBERS.  THE FIRST NUMBER,       )
  53.       WRITE(IWRITE,2)
  54.     2 FORMAT(
  55.      X95H AN INTEGER, IS THE ABSOLUTE SUM OF THE ERROR FLAGS RETURNED FR
  56.      XOM THE RESPECTIVE PATH.         /
  57.      X95H THE SECOND NUMBER IS THE MEASURE OF PERFORMANCE BASED UPON THE
  58.      X RESIDUAL COMPUTED FOR THE PATH.//
  59.      X95H UNDER 'M1' AND 'NO' ARE THE VARIABLES SPECIFYING THE LOWER BOU
  60.      XNDARY INDEX AND THE NUMBER       /
  61.      X28H OF EIGENVALUES TO  TRIDIB.   //
  62.      X62H -1.0  AS THE MEASURE OF PERFORMANCE IS PRINTED IF AN ERROR IN,
  63.      X27H THE CORRESPONDING PATH HAS      /
  64.      X57H PREVENTED THE COMPUTATION OF THE EIGENVECTORS OR VALUES. //
  65.      X41H THE  TQL2    PATH USES THE EISPACK CODES,
  66.      X30H   REDUC2-TRED2-TQL2  -REBAKB,/
  67.      X41H AS CALLED FROM DRIVER SUBROUTINE  RSGBA. /
  68.      X41H THE  TQLRAT  PATH USES THE EISPACK CODES,
  69.      X23H   REDUC2-TRED1-TQLRAT,/
  70.      X41H AS CALLED FROM DRIVER SUBROUTINE  RSGBA. /
  71.      X41H THE  IMTQL2  PATH USES THE EISPACK CODES,
  72.      X30H   REDUC2-TRED2-IMTQL2-REBAKB.)
  73.       WRITE(IWRITE,3)
  74.     3 FORMAT(
  75.      X41H THE  IMTQL1  PATH USES THE EISPACK CODES,
  76.      X23H   REDUC2-TRED1-IMTQL1./
  77.      X41H THE  IMTQLV  PATH USES THE EISPACK CODES,
  78.      X44H   REDUC2-TRED1-IMTQLV-TINVIT-TRBAK1-REBAKB./
  79.      X41H THE  TSTURM  PATH USES THE EISPACK CODES,
  80.      X37H   REDUC2-TRED1-TSTURM-TRBAK1-REBAKB./
  81.      X41H THE  BISECT  PATH USES THE EISPACK CODES,
  82.      X44H   REDUC2-TRED1-BISECT-TINVIT-TRBAK1-REBAKB./
  83.      X41H THE  TRIDIB  PATH USES THE EISPACK CODES,
  84.      X44H   REDUC2-TRED1-TRIDIB-TINVIT-TRBAK1-REBAKB.)
  85.       WRITE(IWRITE,15)
  86.    15 FORMAT(1X,21HD.P. VERSION 04/15/83 )
  87.     5 FORMAT( 53H1       TABULATION OF THE ERROR FLAG  ERROR  AND THE ,
  88.      X    31HMEASURE OF PERFORMANCE  Y  FOR / 5X,
  89.      X    56HTHE  EISPACK  CODES.  THIS RUN DISPLAYS THESE STATISTICS,
  90.      X    23H FOR THE REAL SYMMETRIC / 5X,
  91.      X    46HGENERALIZED EIGENPROBLEM  B*A*X = (LAMBDA)*X ./
  92.      X    55H0ORDER TQL2   TQLRAT IMTQL2 IMTQL1    LB      UB    M   ,
  93.      X    40HIMTQLV   TSTURM   BISECT  M1 NO  TRIDIB )
  94.    10 CALL  RMATIN(NM,N,A,B,AHOLD,BHOLD,0)
  95.       READ(IREADC,50) MM,LB,UB,M11,NO
  96.    50 FORMAT(I4,2D24.16,2(4X,I4))
  97. C
  98. C     MM,LB,UB,M11,  AND  NO  ARE READ FROM SYSIN AFTER THE MATRICES
  99. C     ARE GENERATED.  MM,LB,  AND  UB  SPECIFY TO  BISECT  THE MAXIMUM
  100. C     NUMBER OF EIGENVALUES AND THE BOUNDS FOR THE INTERVAL WHICH IS
  101. C     TO BE SEARCHED.  M11  AND  NO  SPECIFY TO  TRIDIB  THE LOWER
  102. C     BOUNDARY INDEX AND THE NUMBER OF DESIRED EIGENVALUES.
  103. C
  104.       DO  230  ICALL = 1,10
  105.          IF( ICALL .NE. 1 )  CALL  RMATIN(NM,N,A,B,AHOLD,BHOLD,1)
  106. C
  107. C     IF  TQLRAT  PATH (LABEL 80) IS TAKEN THEN  TQL2  PATH (LABEL 70)
  108. C     MUST ALSO BE TAKEN IN ORDER THAT THE MEASURE OF PERFORMANCE BE
  109. C     MEANINGFUL.
  110. C     IF  IMTQL1  PATH (LABEL 85) IS TAKEN THEN  IMTQL2  PATH (LABEL 75)
  111. C     MUST ALSO BE TAKEN IN ORDER THAT THE MEASURE OF PERFORMANCE BE
  112. C     MEANINGFUL.
  113. C     IF  TQL2  (IMTQL2)  PATH FAILS, THEN  TQLRAT  (IMTQL1)  PATH IS
  114. C     OMITTED AND PRINTOUT FLAGGED WITH  -1.0.
  115. C
  116.          GO TO  (70,75,80,85,89,90,95,230,110,230),  ICALL
  117. C
  118. C     RSGBAWZ  USING  TQL2
  119. C     INVOKED FROM DRIVER SUBROUTINE  RSGBA.
  120. C
  121.    70    ICT = 1
  122.          CALL  RSGBA(NM,N,A,B,W,1,Z,E,E2,ERROR)
  123.          IERR(ICT) = ERROR
  124.          IF( ERROR .EQ. 7*N + 1 ) GO TO 200
  125.          M = ERROR - 1
  126.          IF( ERROR .NE. 0 ) GO TO 74
  127.          DO 71 I = 1,N
  128.             W1(I) = W(I)
  129.    71    CONTINUE
  130.          M = N
  131.    74    GO TO  190
  132. C
  133. C     RSGBAWZ  USING  IMTQL2
  134. C
  135.    75    ICT = 2
  136.          CALL  REDUC2(NM,N,A,B,DL,ERROR)
  137.          IERR(ICT) = ERROR
  138.          IF( ERROR .NE. 0 ) GO TO 200
  139.          CALL  TRED2(NM,N,A,W,E,Z)
  140.          CALL  IMTQL2(NM,N,W,E,Z,ERROR)
  141.          IERR(ICT) = ERROR
  142.          M = ERROR - 1
  143.          IF( ERROR .NE. 0 ) GO TO 79
  144.          DO 78  I=1,N
  145.    78       W2(I) = W(I)
  146.          M = N
  147.    79    CALL  REBAKB(NM,N,B,DL,M,Z)
  148.          GO TO  190
  149. C
  150. C     RSGBAW  USING  TQLRAT
  151. C     INVOKED FROM DRIVER SUBROUTINE  RSGBA.
  152. C
  153.    80    ICT = 7
  154.          IF( IERR(1) .NE. 0 ) GO TO 200
  155.          CALL  RSGBA(NM,N,A,B,W,0,A,E,E2,ERROR)
  156.          IERR(1) = ERROR
  157.          IF( ERROR .NE. 0 ) GO TO 200
  158.          MAXEIG = 0.0D0
  159.          MAXDIF = 0.0D0
  160.          DO 81 I = 1,N
  161.             IF( DABS(W(I)) .GT. MAXEIG ) MAXEIG = DABS(W(I))
  162.             U = DABS(W1(I) - W(I))
  163.             IF( U .GT. MAXDIF ) MAXDIF = U
  164.    81    CONTINUE
  165.          IF( MAXEIG .EQ. 0.0D0 ) MAXEIG = 1.0D0
  166.          DFL = 10 * N
  167.          TCRIT(7) = MAXDIF/EPSLON(MAXEIG*DFL)
  168.          GO TO  230
  169. C
  170. C     RSGBAW  USING  IMTQL1
  171. C
  172.    85    ICT = 8
  173.          IF( IERR(2) .NE. 0 ) GO TO 200
  174.          CALL  REDUC2(NM,N,A,B,DL,ERROR)
  175.          CALL  TRED1(NM,N,A,W,E,E)
  176.          CALL  IMTQL1(N,W,E,ERROR)
  177.          IERR(2) = ERROR
  178.          MAXEIG = 0.0D0
  179.          MAXDIF = 0.0D0
  180.          DO 86 I = 1,N
  181.             IF( DABS(W(I)) .GT. MAXEIG ) MAXEIG = DABS(W(I))
  182.             U = DABS(W2(I) - W(I))
  183.             IF( U .GT. MAXDIF ) MAXDIF = U
  184.    86    CONTINUE
  185.          IF( MAXEIG .EQ. 0.0D0 ) MAXEIG = 1.0D0
  186.          DFL = 10 * N
  187.          TCRIT(8) = MAXDIF/EPSLON(MAXEIG*DFL)
  188.          GO TO  230
  189. C
  190. C     RSGBAW1Z  ( USAGE HERE COMPUTES ALL THE EIGENVECTORS )
  191. C
  192.    89    ICT = 3
  193.          CALL  REDUC2(NM,N,A,B,DL,ERROR)
  194.          IERR(ICT) = ERROR
  195.          IF( ERROR .NE. 0 ) GO TO 200
  196.          CALL  TRED1(NM,N,A,D,E,E2)
  197.          CALL  IMTQLV(N,D,E,E2,W,IND,ERROR,RV1)
  198.          IERR(ICT) = ERROR
  199.          M = N
  200.          IF( ERROR .NE. 0 ) M = ERROR - 1
  201.          CALL  TINVIT(NM,N,D,E,E2,M,W,IND,Z,ERROR,RV1,RV2,RV3,RV4,RV6)
  202.          IERR(ICT) = IERR(ICT) + IABS(ERROR)
  203.          CALL  TRBAK1(NM,N,A,E,M,Z)
  204.          CALL  REBAKB(NM,N,B,DL,M,Z)
  205.          GO TO  190
  206. C
  207. C     RSGBA1W1Z  USING  TSTURM
  208. C
  209.    90    ICT = 4
  210.          EPS1 = 0.0D0
  211.          CALL  REDUC2(NM,N,A,B,DL,ERROR)
  212.          IERR(ICT) = ERROR
  213.          IF( ERROR .NE. 0 ) GO TO 200
  214.          CALL  TRED1(NM,N,A,D,E,E2)
  215.          CALL  TSTURM(NM,N,EPS1,D,E,E2,LB,UB,MM,M,W,Z,ERROR,
  216.      X                RV1,RV2,RV3,RV4,RV5,RV6)
  217.          IERR(ICT) = ERROR
  218.          XLB = LB
  219.          XUB = UB
  220.          IF( ERROR .EQ. 3*N + 1 ) GO TO 200
  221.          IF( ERROR .GT. 4*N ) M = ERROR - 4*N - 1
  222.          CALL  TRBAK1(NM,N,A,E,M,Z)
  223.          CALL  REBAKB(NM,N,B,DL,M,Z)
  224.          GO TO  190
  225. C
  226. C     RSGBA1W1Z  USING  BISECT  AND  TINVIT
  227. C
  228.    95    ICT = 5
  229.          EPS1 = 0.0D0
  230.          CALL  REDUC2(NM,N,A,B,DL,ERROR)
  231.          IERR(ICT) = ERROR
  232.          IF( ERROR .NE. 0 ) GO TO 200
  233.          CALL  TRED1(NM,N,A,D,E,E2)
  234.          CALL  BISECT(N,EPS1,D,E,E2,LB,UB,MM,M,W,IND,ERROR,RV4,RV5)
  235.          IERR(ICT) = ERROR
  236.          MBISCT = M
  237.          XLB = LB
  238.          XUB = UB
  239.          IF( ERROR .NE. 0 ) GO TO 200
  240.          CALL  TINVIT(NM,N,D,E,E2,M,W,IND,Z,ERROR,RV1,RV2,RV3,RV4,RV6)
  241.          IERR(ICT) = IABS(ERROR)
  242.          CALL  TRBAK1(NM,N,A,E,M,Z)
  243.          CALL  REBAKB(NM,N,B,DL,M,Z)
  244.          GO TO  190
  245. C
  246. C     RSGBA1W1Z  USING  TRIDIB  USING  TINVIT
  247. C
  248.   110    ICT = 6
  249.          EPS1 = 0.0D0
  250.          CALL  REDUC2(NM,N,A,B,DL,ERROR)
  251.          IERR(ICT) = ERROR
  252.          IF( ERROR .NE. 0 ) GO TO 200
  253.          CALL  TRED1(NM,N,A,D,E,E2)
  254.          CALL  TRIDIB(N,EPS1,D,E,E2,LB,UB,M11,NO,W,IND,ERROR,RV4,RV5)
  255.          IERR(ICT) = ERROR
  256.          IF( ERROR .NE. 0 ) GO TO 200
  257.          M = NO - M11 + 1
  258.          CALL  TINVIT(NM,N,D,E,E2,M,W,IND,Z,ERROR,RV1,RV2,RV3,RV4,RV6)
  259.          IERR(ICT) = IABS(ERROR)
  260.          CALL  TRBAK1(NM,N,A,E,M,Z)
  261.          CALL  REBAKB(NM,N,B,DL,M,Z)
  262. C
  263.   190    IF( M .EQ. 0 .AND. ERROR .NE. 0 ) GO TO 200
  264.          CALL  RMATIN(NM,N,A,B,AHOLD,BHOLD,1)
  265.          CALL  RSGABR(NM,N,M,B,A,W,Z,RV1,RESDUL,RV2)
  266.          DFL = 10 * N
  267.          TCRIT(ICT) = RESDUL/EPSLON(DFL)
  268.          GO TO  230
  269.   200    TCRIT(ICT) = -1.0D0
  270.   230 CONTINUE
  271. C
  272.       IF( MOD(LCOUNT,35) .EQ. 0 ) WRITE(IWRITE,5)
  273.       LCOUNT = LCOUNT + 1
  274.       WRITE(IWRITE,240) N,IERR(1),TCRIT(1),TCRIT(7),IERR(2),TCRIT(2),
  275.      X             TCRIT(8),XLB,XUB,MBISCT,(IERR(I),TCRIT(I),I=3,5),
  276.      X             M11,NO,IERR(6),TCRIT(6)
  277.   240 FORMAT(I4,2(I3,2F6.3),2(1PE8.0),I3,3(I3,0PF6.3),3I3,F6.3)
  278.       GO TO  10
  279.       END
  280.       SUBROUTINE RSGABR(NM,N,M,A,B,W,Z,NORM,RESDUL,R)
  281. C
  282.       DOUBLE PRECISION NORM(M),W(M),A(NM,N),Z(NM,M),NORMA,TNORM,S,SUM, 
  283.      X       SUMZ, SUMA, RESDUL, B(NM,N), NORMB, SUMB, R(N)
  284. C
  285. C     THIS SUBROUTINE FORMS THE 1-NORM OF THE RESIDUAL MATRIX
  286. C     A*B*Z-Z*DIAG(W)  WHERE  A  IS A REAL SYMMETRIC MATRIX,
  287. C     B  IS A REAL SYMMETRIC MATRIX ,  W  IS A VECTOR WHICH
  288. C     CONTAINS  M  EIGENVALUES OF THE EIGENPROBLEM, A*B*Z-Z*DIAG(W),
  289. C     AND  Z  IS AN ARRAY WHICH CONTAINS THE  M  CORRESPONDING
  290. C     EIGENVECTORS OF THE EIGENPROBLEM. ALL NORMS APPEARING IN
  291. C     THE COMMENTS BELOW ARE 1-NORMS.
  292. C
  293. C     THIS SUBROUTINE IS CATALOGUED AS EISPDRV4(RSGABR).
  294. C
  295. C     INPUT.
  296. C
  297. C        NM IS THE ROW DIMENSION OF TWO-DIMENSIONAL ARRAY PARAMETERS
  298. C           AS DECLARED IN THE CALLING PROGRAM DIMENSION STATEMENT;
  299. C
  300. C        M IS THE NUMBER OF EIGENVECTORS FOR WHICH RESIDUALS ARE
  301. C           DESIRED;
  302. C
  303. C        N IS THE ORDER OF THE MATRIX  A;
  304. C
  305. C        A(NM,N) IS A REAL SYMMETRIC MATRIX.  ONLY THE FULL UPPER
  306. C           TRIANGLE NEED BE SUPPLIED;
  307. C
  308. C        B(NM,N) IS A REAL SYMMETRIC MATRIX.  ONLY THE FULL UPPER
  309. C           TRIANGLE NEED BE SUPPLIED;
  310. C
  311. C        Z(NM,M) IS A REAL MATRIX WHOSE FIRST  M  COLUMNS CONTAIN THE
  312. C          APPROXIMATE EIGENVECTORS OF THE EIGENPROBLEM;
  313. C
  314. C        W(M) IS A VECTOR WHOSE FIRST  M   COMPONENTS CONTAIN THE
  315. C           APPROXIMATE EIGENVALUES OF THE EIGENPROBLEM.  W(I) IS
  316. C           ASSOCIATED WITH THE I-TH  COLUMN OF  Z.
  317. C
  318. C
  319. C     OUTPUT.
  320. C
  321. C        Z(NM,M) IS AN ARRAY WHICH CONTAINS  M  NORMALIZED
  322. C           APPROXIMATE EIGENVECTORS OF THE EIGENPROBLEM. THE
  323. C           EIGENVECTORS ARE NORMALIZED USING THE 1-NORM IN SUCH A WAY
  324. C           THAT THE FIRST ELEMENT WHOSE MAGNITUDE IS LARGER THAN THE
  325. C           NORM OF THE EIGENVECTOR DIVIDED BY  N  IS POSITIVE;
  326. C
  327. C        A(NM,N) IS ALTERED BY MAKING THE LOWER TRIANGLE OF  A
  328. C           SYMMETRIC WITH THE UPPER TRIANGLE OF  A;
  329. C
  330. C        B(NM,N) IS ALTERED BY MAKING THE LOWER TRIANGLE OF  B
  331. C           SYMMETRIC WITH THE UPPER TRIANGLE OF  B;
  332. C
  333. C        NORM(M) IS AN ARRAY SUCH THAT FOR EACH  K,
  334. C           NORM(K) = !!A*B*Z(K)-Z(K)*W(K)!!/(!!A!!*!!B!!*!!Z(K)!!)
  335. C           WHERE  Z(K)  IS THE K-TH EIGENVECTOR;
  336. C
  337. C        RESDUL IS THE REAL NUMBER
  338. C           !!A*B*Z-Z*DIAG(W)!!/(!!A!!*!!B!!*!!Z!!);
  339. C
  340. C        R(N) IS A TEMPORARY STORAGE ARRAY USED TO STORE THE PRODUCT
  341. C           B*Z.
  342. C
  343. C     ----------------------------------------------------------------
  344. C
  345.       RESDUL = 0.0D0
  346.       IF( M .EQ. 0 ) RETURN
  347.       NORMA = 0.0D0
  348.       NORMB = 0.0D0
  349. C
  350.       DO 40 I=1,N
  351.          SUMB = 0.0D0
  352.          SUMA = 0.0D0
  353.          IF(I .EQ. 1) GO TO 20
  354. C
  355.          DO 10 L=2,I
  356.            A(I,L-1) =A(L-1,I)
  357.            B(I,L-1) =B(L-1,I)
  358.            SUMB =SUMB + DABS(B(L-1,I))
  359.    10      SUMA =SUMA + DABS(A(L-1,I))
  360. C
  361.    20    DO 30 L=I,N
  362.            SUMA =SUMA + DABS(A(I,L))
  363.    30      SUMB =SUMB + DABS(B(I,L))
  364. C
  365.          NORMA = DMAX1(NORMA,SUMA)
  366.    40    NORMB = DMAX1(NORMB,SUMB)
  367. C
  368.       NORMA = NORMA*NORMB
  369.       IF(NORMA .EQ. 0.0D0) NORMA = 1.0D0
  370. C
  371.       DO 100 I=1,M
  372.          S = 0.0D0
  373.          SUMZ = 0.0D0
  374.          DO 55 L = 1,N
  375.            SUM = 0.0D0
  376.            DO 50 K = 1,N
  377.    50        SUM = SUM + B(L,K)*Z(K,I)
  378.            SUMZ = SUMZ + DABS(Z(L,I))
  379.    55      R(L) = SUM
  380. C
  381.          DO 65 L = 1,N
  382.            SUM = - W(I)*Z(L,I)
  383.            DO 60 K = 1,N
  384.    60        SUM = SUM + R(K)*A(L,K)
  385.    65      S = S + DABS(SUM)
  386.          NORM(I) = SUMZ
  387.          IF(SUMZ .EQ. 0.0D0) GO TO 100
  388. C        ..........THIS LOOP WILL NEVER BE COMPLETED SINCE THERE
  389. C                  WILL ALWAYS EXIST AN ELEMENT IN THE VECTOR Z(I)
  390. C                  LARGER THAN !!Z(I)!!/N..........
  391.          DO 70 L=1,N
  392.             IF(DABS(Z(L,I)) .GE. NORM(I)/N) GO TO 80
  393.    70       CONTINUE
  394. C
  395.    80    TNORM = DSIGN(NORM(I),Z(L,I))
  396. C
  397.          DO 90 L=1,N
  398.    90       Z(L,I) = Z(L,I)/TNORM
  399. C
  400.          NORM(I) = S/(NORM(I)*NORMA)
  401.   100    RESDUL = DMAX1(NORM(I), RESDUL)
  402. C
  403.       RETURN
  404.       END
  405.       SUBROUTINE RMATIN(NM,N,A,B,AHOLD,BHOLD,INITIL)
  406. C
  407. C     THIS INPUT SUBROUTINE READS TWO REAL MATRICES  A  AND  B  FROM
  408. C     SYSIN OF ORDER N.
  409. C     TO GENERATE THE MATRICES INITIALLY,  INITIL  IS TO BE 0.
  410. C     TO REGENERATE THE MATRICES FOR THE PURPOSE OF THE RESIDUAL
  411. C     CALCULATION,  INITIL  IS TO BE  1.
  412. C
  413. C     THIS ROUTINE IS CATALOGUED AS  EISPDRV4(RSGREADI).
  414. C
  415.       DOUBLE PRECISION A(NM,NM),B(NM,NM),AHOLD(NM,NM),BHOLD(NM,NM) 
  416.       INTEGER  IA( 20), IB( 20)
  417.       DATA IREADA/1/,IREADB/2/,IWRITE/6/
  418. C
  419.       IF( INITIL .EQ. 1 )  GO TO  30
  420.       READ(IREADA,5) N, M
  421.     5 FORMAT(I6,6X,I6)
  422.       IF( N .EQ. 0 )  GO TO  70
  423.       IF (M .NE. 1) GO TO 16
  424.       DO  10  I = 1,N
  425.          READ(IREADA,17) (IA(J), J=I,N)  
  426.          DO   9  J = I,N
  427.            A(I,J) = IA(J)
  428.     9      A(J,I) =  A(I,J)
  429.    10 CONTINUE
  430.    11 READ(IREADB,5) N,M
  431.       IF( M .NE. 1 ) GO TO 20
  432.       DO 15 I = 1,N
  433.          READ(IREADB,17) (IB(J), J=I,N)   
  434.          DO 14 J = I,N
  435.             B(I,J)=IB(J)
  436.    14       B(J,I)=B(I,J)
  437.    15 CONTINUE
  438.       GO TO 22
  439.    16 DO  18  I = 1,N
  440.          READ(IREADA,17) (IA(J), J=1,N)  
  441.    17    FORMAT(6I12)
  442.          DO  18  J = 1,N
  443.    18      A(I,J) = IA(J)
  444.       GO TO 11
  445.    20 DO 25 I = 1,N
  446.          READ(IREADB,17) (IB(J),J=1,N) 
  447.          DO 25 J = 1,N
  448.    25    B(I,J) = IB(J)
  449.    22 DO  23  I = 1,N
  450.          DO  23  J = 1,N
  451.            BHOLD(I,J) = B(I,J)
  452.    23      AHOLD(I,J) = A(I,J)
  453.       RETURN
  454.    30 DO  40  I = 1,N
  455.          DO  40  J = 1,N
  456.            B(I,J) = BHOLD(I,J)
  457.    40      A(I,J) = AHOLD(I,J)
  458.       RETURN
  459.    70 WRITE(IWRITE,80)
  460.    80 FORMAT(47H0END OF DATA FOR SUBROUTINE  RMATIN(RSGREADI). /1H1)
  461.       STOP
  462.       END
  463.